【发布时间】:2015-09-21 06:43:18
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
char** mlc(char** f){
int count=10;
int size=10;
f=(char**)malloc(count*sizeof(char*));
for(int i=0;i<count;i++){
f[i]=(char*)malloc(size*sizeof(char));
}
return f;
}
int main()
{
char** f;
f=mlc(f);
f[0][0]='1';
f[0][1]='\0';
printf("%s",f[0]);
return 0;
}
我使用这段代码可以完美运行,但是当我使用下面的代码时,会出现分段错误:
#include <stdio.h>
#include <stdlib.h>
void mlc(char** f){
int count=10;
int size=10;
f=(char**)malloc(count*sizeof(char*));
for(int i=0;i<count;i++){
f[i]=(char*)malloc(size*sizeof(char));
}
return f;
}
int main()
{
char** f;
mlc(f);
f[0][0]='1';
f[0][1]='\0';
printf("%s",f[0]);
return 0;
}
所以,主要区别是第一个代码我返回了指针,为什么第二个代码出错了?
【问题讨论】:
-
请see why not to cast
malloc()和C中的family返回值。 -
@SouravGhosh 你是 no-casting-malloc 的 Barry Allen :p
-
"...第一个代码我返回了指针,为什么第二个代码出错了?因为你做了not"return [修改] 指针".
-
so(因为答案被阻止),这可能是不好的编程风格,但是将
void更改为void*并将mlc(f);行更改为f=mlc(f);可以解决您的问题(如@SouravGhosh指出,您没有将f分配回来)。 -
需要注意的几个关键事项:1) 在这两个示例中,发布的代码都无法干净地编译。建议在编译和修复这些警告时启用所有警告。 2) 'sizeof(char)' 始终为 1,因此对 malloc() 的调用没有影响。 IE。它只是使代码混乱。建议删除该表达式。 3) 总是检查 (!=NULL) malloc() 的返回值以确保操作成功 4) 编译器抱怨未初始化的参数给 mlc()。建议去掉那个参数,在mlc函数本地定义'f',
标签: c pointers segmentation-fault malloc dynamic-memory-allocation