在递归中传递指针会产生分段错误

时间:2014-08-22 05:27:10

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

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

#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)

2 个答案:

答案 0 :(得分:2)

在函数void list(...)

char newpath[]="0";

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

也在这里

 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;
}

答案 1 :(得分:0)

您应该更改

char newpath[] = "0"



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

并包含stdlib.h库。

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

PS:我正在添加4,因为/newpath中的字符串外还需要4个字符 最后一个字节用于标记字符串结尾的\0字符。