【问题标题】:passing pointers in recursion gives segmentation fault在递归中传递指针会导致分段错误
【发布时间】:2014-10-15 21:35:08
【问题描述】:

当从递归返回时,它给出了分段错误...如下面的输出所示,它正在进入递归调用,但是在返回时出现分段错误..是什么原因..我错过了一些无效的指针使用在这里?

#include<stdio.h>
#include<string.h>


void list(char path[],int i) {
    printf("%s\n",path);
    i--;
    char newpath[]="0";
    if(i>0){
        strcpy(newpath,"");
        strcpy(newpath,path);
        strcat(newpath,"/");
        strcat(newpath,"new");
        list(newpath,i);
        printf("%s\n",path);
    }
    else return;
    return;
}


int main(){
    list("start",10);
    return 0;
}

输出:

start
start/new
start/new/new
start/new/new/new
start/new/new/new/new
start/new/new/new/new/new
start/new/new/new/new/new/new
start/new/new/new/new/new/new/new
start/new/new/new/new/new/new/new/new
start/new/new/new/new/new/new/new/new/new
start/new/new/new/new/new/new/new/new
Segmentation fault (core dumped)

【问题讨论】:

    标签: c pointers recursion segmentation-fault parameter-passing


    【解决方案1】:

    在函数void list(...)

    char newpath[]="0";

    其中没有足够的内存用于复制缓冲区。 (只有 2 个字节。一个用于 char,另一个用于空字符,您正在尝试在其中复制更多字节)。

    这里也有

     strcpy(newpath,"");
     strcpy(newpath,path);
    

    没有意义。第二个覆盖newpath 的最新内容。

    您需要手动计算缓冲区的长度并分配那么多。

    #include<stdio.h>
    #include<string.h>
    
    
    void list(char path[],int i) 
    {
        int len;
        printf("%s\n",path);
        len = strlen(path)+strlen("/new")+1;
        char *newpath=malloc(len);
        memset(newpath,0,len);
        i--;
        if(i>0){
            strcpy(newpath," ");
            strcat(newpath,path);
            strcat(newpath,"/");
            strcat(newpath,"new");
            list(newpath,i);
            printf("%s\n",path);
            free(newpath);
        }
        else return;
        return;
    }
    
    
    int main(){
        list("start",10);
        return 0;
    }
    

    【讨论】:

    • increasing to newpath[256] 确实解决了! :D 但它限制了字符串的长度。在我的应用程序中,我不知道字符串会有多长..而且我也不太明白内存足够的原因
    • @DharakKharod 您需要先计算并使用malloc动态分配内存。
    • memset 的大小参数错误。 sizeof(newpath) 是指针的大小。
    • 只是好奇.. 在使用 malloc 时,您没有将其类型转换为 (char*) ... 没有它可以工作吗?
    • @DharakKharod 是的,为什么不呢。也不需要对malloc 进行类型转换。这不好,因为 malloc 的返回自动/隐式转换为所需的类型。
    【解决方案2】:

    你应该换行

    char newpath[] = "0"



    char *newpath = malloc(strlen(path) + 5)

    并包含stdlib.h 库。

    这将为每个变量提供足够的内存,您可以追加。

    PS:我添加 4 是因为 /new 除了 path 中的字符串之外还需要 4 个字符 最后一个字节是\0 字符,它标志着字符串的结束。

    【讨论】:

    • 你应该加5,因为'\0'在字符串的末尾
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多