为什么我的程序在为双指针C分配内存时会产生seg-fault

时间:2017-07-14 17:15:07

标签: c pointers dynamic-memory-allocation c-strings

为什么此程序会导致分段错误?我正在尝试拥有一个动态分配内存的指针数组,以便我可以拥有一个字符串数组。

我搜索了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);

}

2 个答案:

答案 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()