【问题标题】:C memory layout for two dimensional string arrays二维字符串数组的 C 内存布局
【发布时间】:2016-03-27 20:44:54
【问题描述】:

我试图弄清楚 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;
}

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

提前致谢!

【问题讨论】:

    标签: c arrays string memory


    【解决方案1】:

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

    以下是您如何声明真正的二维 char 数组:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2015-07-20
      • 2016-05-06
      相关资源
      最近更新 更多