为什么此程序会导致分段错误?我正在尝试拥有一个动态分配内存的指针数组,以便我可以拥有一个字符串数组。
我搜索了How to pass a double pointer to a function without segmentation fault C language
等类似问题请解释为什么它会发生错误
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void mem_alloc(char* p, char** dp);
int entries = 0;
int mem_allocated = 0;
int main() {
char* p = "ksdfahj93qhf9";
char* p1 = "siodfnrieopq";
char* p2 = "erf9ih94gri9g";
char** dp = NULL;
mem_alloc(p, dp);
mem_alloc(p1, dp);
mem_alloc(p2, dp);
for(int i = 0; i < entries; i++) {
printf("%s", dp[i]);
}
}
void mem_alloc(char *p, char** dp) {
if(entries == mem_allocated)
if(mem_allocated == 0)
mem_allocated = 3;
void** temp = realloc(dp, mem_allocated * (sizeof(p)));
if(!temp)
perror("Memory allocation failed!");
dp = (char**) temp;
strcpy(dp[entries++], p);
}
答案 0 :(得分:1)
在mem_alloc
函数中修改函数参数dp
。此修改在函数外部不可见。因此,dp
中的main
永远不会更改,仍会设置为NULL。
您需要将此变量的地址传递给函数,然后在函数中取消引用该指针以更改它。
所以你的功能变成了:
void mem_alloc(char *p, char ***dp) {
if(entries == mem_allocated)
if(mem_allocated == 0)
mem_allocated = 3;
char **temp = realloc(*dp, mem_allocated * (sizeof(p)));
if(!temp)
perror("Memory allocation failed!");
*dp = temp;
(*dp)[entries++] = strdup(p); // space also needs to be allocated for the new string
}
你这样称呼它:
mem_alloc(p, &dp);
答案 1 :(得分:0)
两个错误。首先是dbush提到的那个。
其次,在复制之前,您没有为字符串分配空间。您可以使用strndup()
代替strcpy()
。