我有一些让我困惑的代码。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char* string1 = "this is a test";
char string2[] = "this is a test";
printf("%i, %i\n", sizeof(string1), sizeof(string2));
system("PAUSE");
return 0;
}当它输出string1的大小时,它会打印4,这是预期的,因为指针的大小是4个字节。但是当它输出string2时,它输出15。我认为数组是一个指针,所以string2的大小应该与string1相同,对吗?那么,为什么它会为同一类型的数据(指针)打印两个不同的大小呢?
发布于 2010-12-07 18:18:21
数组不是指针。在某些情况下,数组名称会衰减为指向数组的第一个元素的指针:当您将数组传递给一个函数时,当您将它分配给一个指针时,等等。但如果不是数组,则数组就是数组--它们存在于堆栈中,具有可以用sizeof确定的编译时大小,以及所有其他好的东西。
发布于 2010-12-07 18:18:41
string1是一个指针,而string2是一个数组。
第二行类似于int a[] = { 1, 2, 3};,它将a定义为一个长度-3数组(通过初始化程序)。
string2的大小是15,因为初始化程序是以nul结尾的(所以15是字符串+1的长度)。
发布于 2010-12-07 18:21:18
对于大小未知的数组,其大小等效于指针。静态大小数组作为自己的类型来计算,大小报告数组所需的存储空间的大小。即使分配string2时没有显式大小,C编译器也会神奇地处理它,因为它是由引用的字符串直接初始化的,并将其转换为具有静态大小的数组。(由于内存没有以任何其他方式分配,所以它毕竟无法做任何其他事情。)静态大小数组是与指针(或动态数组)不同的类型!对于sizeof行为而言,因为C就是这样的。
这似乎是相当大的行为的一个不错的参考。
https://stackoverflow.com/questions/4380090
复制相似问题