我试图像这样分配内存:
我认为我将{mall}用于char**
:
char** arr = malloc(sizeof(char**)*(SIZE));
然后我想我会循环遍历arr
并将arr
的每个值设置为另一个malloc
来电返回的内容:
char** temp = arr;
while(temp < arr + SIZE) {
*temp = malloc(sizeof(char*)*(SIZE));
temp++;
}
但是我在while循环中的malloc
行上进行了段错误。出了什么问题?
答案 0 :(得分:1)
这里真正的问题不是错误的sizeof
,而是对第一个malloc
的调用失败的可能性更大。我怀疑以下变化是解决问题的真正方法。
char** arr = malloc(sizeof(char**)*(SIZE));
if (!arr) {
// Handle the error
}
else {
char** temp = arr;
while(temp < arr + SIZE) {
*temp = malloc(sizeof(char*)*(SIZE));
temp++;
}
}
我不相信错误的sizeof
计算确实相关。考虑一下(据我所知)sizeof(char**) == sizeof(char*)
,所以第一个malloc
实际上分配了正确的内存量(假设它实际上成功)。对malloc
的内部调用本身不应该导致段错误,而应该只返回一个空指针(除非你在一些看不见的代码中把你的记忆搞得一团糟)。相反,它是可能导致段错误的间接*temp
,并且只有当temp
指向原始分配的末尾时才会发生这种情况,而不是(除非,第一个{{ 1}}失败)。
答案 1 :(得分:1)
@TomKarzes指出,
你的两个
sizeof
参数都是错误的。想想你实际分配的内容。第一个应该是sizeof(char *) * SIZE
,第二个应该是sizeof(char) * SIZE
。请记住,sizeof
中malloc
的参数应该总是比结果指针类型少一个间接级别。
这是对的。它对我有用。