c-字符串大小和地址间距的指针数组不匹配



如果这是一个愚蠢的问题,很抱歉。我试着教自己一些编程,但在这里陷入了一点困惑。代码:

#include <stdio.h>
void main()
{
int i;
char *array[5]={"Apples", "mangoes", "grapes", "bananas", "oranges"};
printf("THIS IS FROM THE ARRAY:n");
for(i = 0; i < 5; i++)
{
printf("String=%s | ", array[i]);
printf("Address of string literal = %i", array[i]);
printf(" | Size = %un",sizeof(array[i]));
}
}

产生输出:输出图像

THIS IS FROM THE ARRAY:
String=Apples | Address of string literal = 4210688 | Size = 8
String=mangoes | Address of string literal = 4210695 | Size = 8
String=grapes | Address of string literal = 4210703 | Size = 8
String=bananas | Address of string literal = 4210710 | Size = 8
String=oranges | Address of string literal = 4210718 | Size = 8

为什么地址之间的差异不是一致的8,尽管输出的大小表示大小是8?

4210688 4210695(差异为7(4210695 4210703(差为8(4210703 4210710(差值为7(4210710 4210718(差异为8(

如果我的怀疑是正确的(这些不是字符串在内存中的地址,而只是指针或其他东西的地址(,我该如何更改代码以列出实际字符串在内存的地址?我在Windows 64位系统上使用代码块IDE,GNU GCC编译器。如果你需要更多相关信息,我很乐意提供。

首先,打印地址时,应使用%p格式说明符并将参数强制转换为void *

也就是说,打印的地址是字符串存储的地址。如果你仔细观察每个指针地址之间的差异,你会发现这些差异与每个字符串的大小完全匹配。字符串文字通常存储在只读数据段中,在这种情况下,每个字符串在内存中恰好是连续的。

如果要打印每个数组元素的地址(每个数组元素都是一个指针(,那么您会看到它们之间的差异为8。

sizeof(array[i])提供的是char *的大小,而不是字符串的长度。使用strlen()+1表示字符串中的字节数。

7的差异对于一个6个字母的单词(+终止NUL字符(来说是完全合理的。

此外,正如chux所说,您应该使用%p来打印指针值(为了更加正确,参数应该强制转换为(void *)(。

如果打印strlen(array[i])而不是sizeof(array[i]),则可以发现char*的数组连续存在。

main()应返回int。void main()不是标准值。

您应该为数组声明const char*,而不是char*。它是不可修改的。

#include <stdio.h>
#include <string.h>
int main()
{
int i;
const char* array[5] = { "Apples", "mangoes", "grapes", "bananas", "oranges" };
printf("THIS IS FROM THE ARRAY:n");
for (i = 0; i < 5; i++)
{
printf("String=%s | ", array[i]);
printf("Address of string literal = %i", array[i]);
printf(" | Size = %un", strlen(array[i]));
}
return 0;
}

最新更新