不时有人在SO上指出char
(也就是"字节")不一定是8位.
似乎8位char
几乎是通用的.我原本认为,对于主流平台,必须有一个8位char
才能确保其在市场上的可行性.
现在和历史上,哪些平台使用的char
不是8位,为什么它们与"普通"8位不同?
在编写代码时,考虑跨平台支持(例如,对于通用库而言),对于非8位平台,值得考虑的是什么char
?
在过去,我遇到过一些char
16位的ADI DSP .我认为DSP是一种利基架构.(然后,当时手工编写的汇编程序很容易击败可用的C编译器可以做的事情,所以我在该平台上没有真正获得C的经验.)
我使用sizeof来获取C中结构的大小,但我得到的结果是意外的.
struct sdshdr {
int len;
int free;
char buf[];
};
int main(){
printf("struct len:%d\n",(sizeof(struct sdshdr)));
return 0;
} //struct len:8, with or without buf
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么不buf
占用任何空间,为什么int
64位CPU上的类型大小仍为4?
这是输出gcc -v
:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud) 我一直认为:
char
由一个字节表示,sizeof (char)
总是1
,char
s 计)是RAM的字节数(+交换空间).但是现在我已经阅读了维基百科条目,我不再那么肯定了.
我的假设中有哪一个是错的?哪一个是危险的?
我有一个char数组:
char* name = "hello";
Run Code Online (Sandbox Code Playgroud)
我想为该名称添加一个扩展名来实现它
hello.txt
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
name += ".txt"
不行
我需要在C中进行模256运算.所以我可以简单地做
unsigned char i;
i++;
Run Code Online (Sandbox Code Playgroud)
代替
int i;
i=(i+1)%256;
Run Code Online (Sandbox Code Playgroud) 似乎有很多方法可以在C中获得用户输入.
什么是最简单的方法,需要很少的代码?
基本上我需要显示这个:
Enter a file name: apple.text
Run Code Online (Sandbox Code Playgroud)
基本上我需要询问用户文件名.所以我需要的东西只能得到用户输入的那个词.
在我的课上,我们正在编写自己的C的malloc()函数副本.为了测试我的代码(当前可以分配空间很好)我正在使用:
char* ptr = my_malloc(6*sizeof(char));
memcpy(ptr, "Hello\n", 6*sizeof(char));
printf("%s", ptr);
Run Code Online (Sandbox Code Playgroud)
输出通常是这样的:
Hello
Unprintable character
Run Code Online (Sandbox Code Playgroud)
有些调试认为我的代码本身并没有造成这种情况,因为ptr的内存如下:
[24个字节的元信息] [请求的字节数] [填充]
所以我认为printf正在进入填充,这只是垃圾.所以我进行了测试:
printf("%s", "test\nd");
得到:
test
d
Run Code Online (Sandbox Code Playgroud)
这让我想知道,当DOES printf("%s",char*)停止打印字符时?
ISO C标准要求CHAR_BIT
至少为8.
POSIX强制CHAR_BIT
等于8,并且(几乎?)所有使用八位字节的网络和通信标准,是否有任何当代C实现CHAR_BIT
> 8?
(注意:我对使用18或36位字的历史计算机体系结构不感兴趣.这是关于C的真正问题,因为它在当前的硬件上使用;考虑使用C99或更高版本的系统).
做以下事情是否安全?
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main(void)
{
char* msg;
strcpy(msg, "Hello World!!!"); //<---------
printf("%s\n", msg);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者应该使用以下内容?
char* msg = (char*)malloc(sizeof(char) * 15);
Run Code Online (Sandbox Code Playgroud) 我看到人们经常编写C代码,例如:
char *ptr = malloc(sizeof(char)*256);
Run Code Online (Sandbox Code Playgroud)
这真的有必要吗?标准说,sizeof(char)==1
根据定义,只写这样有意义:
char *ptr = malloc(256);
Run Code Online (Sandbox Code Playgroud)
谢谢,Boda Cydo.