二维字符串数组的 C 内存布局

标签 c arrays string memory

我试图弄清楚 C 中二维数组的内存布局是如何工作的。特别是字符串数组。阅读 this site 后我知道它应该如何工作

但是当进行分配时

char *states[] = {
    "California", "Oregon",
    "Washington", "Texas"
};

行大小是否自动设置为匹配最长字符串的大小?

我尝试使用以下代码来解决它,但我仍然不明白。

int main(){
  char *test[] = {
    "0", "12",
    "345", "6789"
  };
  int i = 0;
  int j = 0;
  for (i=0; i<10; i++){
   for (j=0; j<10; j++){
     printf("%d,%d: ", i,j);
     printf("%c\n", test[i][j]);
   }
 }
 return 0;
}

我感觉所有行都应该具有相同的大小,但在遍历数组时,下一个字符串似乎在单个空格之后立即开始。

提前致谢!

最佳答案

您实际上并没有二维 char 数组。相反,您有一个一维 char 指针数组。在二维 char 数组中,所有字符串都将分配完全相同的内存量。您的案例实际上在很多方面都更简单。编译器创建一堆常量字符串,并使用这些指针初始化 char * 数组。每个字符串都有自己独立的长度。

以下是声明真正的二维 char 数组的方法:

char states[][11] = {
    "California",
    "Oregon",
    "Washington",
    "Texas"
};

此处字符串长度是明确的(最多 10 个字符,空字节加 1)。每个字符串都被赋予完整的字符数,无论是否全部使用。

关于二维字符串数组的 C 内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36252452/

相关文章:

php - 循环数组以在数据库中查找结果

c++ - 定义结构数组

c - 如何正确释放 malloc 的结构?

c - 是否可以根据是否在 C 中定义头文件来添加某些代码部分?

c - 文本被 append 在文件的开头而不是文件的末尾

ruby-on-rails - ruby group_by 对象?

c - strcmp 的结果在所有机器和编译器上都一样吗?

python - Python 中使用 Format() 进行动态字符串替换

python - 这两个Python代码的时间复杂度差异是多少?

c - 是否可以使用 SonarQube 分析 Linux C 项目?