字符串数组中字符串的 sizeof

sizeof for a string in array of strings

我尝试从 python 切换到 c 有一段时间了,我只是检查了几个函数,引起我注意的是 sizeof 运算符,它 returns 对象的大小(以字节为单位) .我创建了一个字符串数组,并希望找到该数组的大小。我知道可以通过 sizeof(array)/sizeof(array[0]) 来完成。但是,我觉得这有点令人困惑。

我希望大数组是二维的(这只是表示不同的一维数组)并且这个大数组中的每个字符数组占用的字节数与这个大数组中字符数组的最大大小一样多。下面的例子

#include <stdio.h>
#include <string.h>

const char *words[] = {"this","that","Indian","he","she","sometimes","watch","now","browser","whatsapp","google","telegram","cp","python","cpp","vim","emacs","jupyter","space","earphones","laptop","charger","whiteboard","chalk","marker","matrix","theory","optimization","gradient","descent","numpy","sklearn","pandas","torch","array"};

const int length = sizeof(words)/sizeof(words[0]);

int main()
{
        printf("%s",words[1]);
        printf("%i",length);
        printf("\n%lu",sizeof(words[0]));
        printf("\n%lu %lu %s",sizeof(words[27]),strlen(words[27]),words[27]);
        return 0;
}

[OUT]
that35
8
8 12 optimization

每个字符数组占用8个字节,包括字符数组“优化”。我不明白这里发生了什么,strlen 函数给出了预期的输出,因为它只是在字符数组中找到 NULL 字符,我希望 sizeof 运算符的输出比 strlen 的输出多 1 .

PS:我没有找到解决此问题的资源。

这是因为 sizeof(words[27]) 给出了指针的大小,而 words[27] 是指针,指针在每台机器上都有固定的大小,主要是 8 bytesx86_64 架构 CPU。此外,words 是一个指针数组。

each of the character arrays occupy 8 bytes, including the character array "optimization".

不是,words中的每个单词都占用固定的内存(它们的长度),8 bytes是指针的大小,即unsigned long int,它存储的是单词的地址在 words.

const int length = sizeof(words)/sizeof(words[0]);

上面一行给出了35因为words没有作为指针衰减,它存储在程序的数据部分,因为它是一个全局变量。

阅读更多关于指针衰减的信息:

  1. https://www.geeksforgeeks.org/what-is-array-decay-in-c-how-can-it-be-prevented/
  2. https://www.opensourceforu.com/2016/09/decayintopointers/

words 是一个 array of pointer to const char,静态初始化如下图:

实际上,words 可能指向 read-only-data 中的多个条目。要以这种方式使用 words,使用 strlen.

是完全合适的