Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sizeof不';t返回C中变量的真实大小_C_Sizeof - Fatal编程技术网

Sizeof不';t返回C中变量的真实大小

Sizeof不';t返回C中变量的真实大小,c,sizeof,C,Sizeof,考虑以下代码 #include <stdio.h> void print(char string[]){ printf("%s:%d\n",string,sizeof(string)); } int main(){ char string[] = "Hello World"; print(string); } 那么这有什么不对呢?string是一个指针,它的大小是4。您可能需要strlen。它是字符指针的大小,而不是字符串的长度 使用string.h中的strlen获取字

考虑以下代码

#include <stdio.h>

void print(char string[]){
 printf("%s:%d\n",string,sizeof(string));
}

int main(){
 char string[] = "Hello World";
 print(string);
}

那么这有什么不对呢?

string
是一个指针,它的大小是4。您可能需要strlen。

它是字符指针的大小,而不是字符串的长度

使用string.h中的strlen获取字符串长度。


请看这里,它的输出与您的相同…并找出您的错误所在

c中的字符串只是一个字符数组。它不一定是NUL终止的(尽管在您的情况下是)。函数无法知道传递给它的字符串有多长——它只是将字符串的地址作为指针给定


“字符串”就是指针,在您的计算机(32位计算机)上,存储指针需要4个字节。因此sizeof(string)是4,它确实返回“变量”(实际上是函数的参数)的真实大小。问题是这不是你认为的那种类型

char string[]
作为函数的参数,相当于
char*string
。您得到的结果是
4
,因为这是系统上
char*
的大小


请在此阅读更多内容:

数组将变为ANSI C中函数参数的指针。

除非它是
大小的操作数或一元
&
运算符,或者是用于初始化声明中另一个数组的字符串文字,否则数组表达式将隐式转换其类型(“衰减”)从“T的N元素数组”到“指向T的指针”,其值将是数组中第一个元素的地址(,6.3.2.1/3)

main
中的对象
string
char
的12元素数组。在调用
main
中的
print
时,表达式
string
的类型将从
char[12]
转换为
char*
。因此,
print
函数接收指针值,而不是数组。在函数参数声明的上下文中,
ta[]
ta[N]
都是
T*
的同义词;请注意,这仅适用于函数参数声明(这是C的一个更大的错误特性)


因此,
print
函数使用的是指针类型,而不是数组类型,因此
sizeof string
返回的是
char*
的大小,而不是数组的大小。

您要求系统提供sizeof(字符数组开头的地址),string是一个对象,要获得关于它的长度的信息,您必须通过正确的OO接口询问它


对于std::string,成员函数string.length()将返回string对象存储的字符数。

您希望输出什么?我建议使用
std::string
。它更容易使用。长度是<代码> STR.siz()/Standard >。STD::String是C++,而不是CcRead的副本,如果您知道字符串是NUL终止的,那么这是OK。在本应用程序中,它是。但一般来说,字符串只是一个字符array@Paul:通常,“字符串”用于表示C上下文中的NTB。字符数组只是一个字符数组。好的,我可以一般收回(但昨天有一个问题是关于一个错误的假设,即字符数组可以假定为终止的,所以我认为值得指出)@Paul:我不否认这个约定有时会出错:-)。我同意人们必须小心,应该受到警告。通常,对于函数参数,我会把一个需要的NUL终止字符数组作为一个“字符串”,而不是一个终止的数组作为一个“缓冲区”或“数组”。我的链接是关于C++的,而不是C。所以,问题是什么?尽管他把问题标记为C精确。他把他的问题标记为C。所以知道C++中的行为是不是很有帮助…在
打印的定义中
。在
main
中,
string
是数组的名称。根据定义,C中的字符串必须以0结尾(7.1.1)。如果
char
序列不是以0结尾的,那么它就不是一个字符串。这只是将门柱侧向移动了一点。char[]字符串是否作为定义字符串的参数?实际上,这取决于应用程序。只有当它指向的序列以0结尾时。所有字符串都是字符序列,但并非所有字符序列都是字符串。如果
字符串
已初始化为
{'H','e','l','l','o','W','o','r','l','d'}
,则
打印的输出将是不确定的;它将打印“Hello World”,后跟一些垃圾,直到它碰巧看到一个0值字符。
Hello World:4