以下代码输出分段错误: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功能?
答案 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不同。第一个在堆栈上分配,而后者在堆上分配。