Deference运算符在C中构建2d字符串数组

时间:2017-04-16 11:23:01

标签: c string

以下代码输出分段错误:11

 #include<stdio.h>
 #include<string.h>
 int main(){
 char **total;
 strcpy(*(total+1),"hello");
 printf("%s",*(total+1));
 }

但是下面的一个(当没有**数组初始化时)

#include<stdio.h>
#include<string.h>
int main(){
char total[3][100];
strcpy(total[1],"hello");
printf("%s",total[1]);
} 

那么第一个代码究竟出了什么问题?是由于初始化步骤还是strcpy功能?

2 个答案:

答案 0 :(得分:1)

使用char total[3][100]自动为您的阵列保留一部分内存,称为total。 使用char **total,您必须为阵列分配内存。

答案 1 :(得分:0)

你根本没有分配内存。

char **total = malloc(3*sizeof(char*));
for(int i=0; i!=3; ++i) total[i]=malloc(100*sizeof(char));

不要忘记解除分配:

for(int i=0; i!=3; ++i) free(total[i]);
free(total);

使用指针算法进行访问会做同样的事情,但是它们可能会使读者感到困惑。您可以在指针上使用相同的数组索引语法。

另请注意,使用数组语法进行静态分配与使用指针和malloc不同。第一个在堆栈上分配,而后者在堆上分配。