C语言能否用一行malloc完成指针数组的数组空间分配?
问题解答
1 原有代码的错误点
*(out+x)=malloc(sizeof(char)*100);这行写法是正确的,等价于out[x] = malloc(100);,语法和逻辑都没有问题。- 出现
free non-heap object警告的原因:char *out[10]是声明在栈上的数组,本身不是动态分配的堆内存,不能直接调用free(out)释放。你之前循环分配的是每个指针指向的堆内存,所以需要循环释放每个out[x],而不是释放out本身。
原有循环写法修正后的释放逻辑应该是:
for(int i=0; i<10; i++) { free(out[i]); // 逐个释放每个malloc出来的内存块 } // 不需要额外free(out)
2 两种强转写法报错的原因
C语言标准不允许将malloc返回的void*强制转换为数组类型(你写的char[10][100]、char*[10]都是数组类型),所以编译直接报错,这两种写法本身不符合语法规则。
3 不用循环的一行分配+一行释放实现方案
完全可以实现,推荐你用指向数组的指针代替栈上的指针数组,语法上完全兼容你之前out[i][j]的访问习惯,真正实现一行分配、一行释放:
分配代码(一行完成)
char (*out)[100] = malloc(10 * sizeof(*out));
这段代码一次性分配了10个长度为100的char数组的连续空间,你可以直接用out[0][0]、out[9][99]的方式访问,和你之前用指针数组的用法没有任何区别。
释放代码(一行完成)
free(out);
因为是整块分配的连续内存,不需要循环释放,直接free一次即可,也不会出现你之前的警告。
4 如果你一定要保留char *out[10]的栈上指针数组结构
也可以实现单次分配单次释放,不需要循环malloc,写法如下:
char *out[10]; // 一行完成分配:先分配整块内存,再给每个指针赋值 char *buf = malloc(10*100); for(int i=0; i<10; i++) out[i] = buf + i*100; // 使用完后一行释放,不需要循环 free(buf);
这种方案同样不需要循环malloc和循环free,性能比逐个malloc更高,内存是连续的。
内容的提问来源于stack exchange,提问作者user786
相关产品推荐
相关产品推荐

