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