C 指向字符串的指针数组,出现分段错误

C 指向字符串的指针数组,出现分段错误,c,pointers,gcc,libc,C,Pointers,Gcc,Libc,我正在学习c语言的指针 我写了一个小程序,但我犯了错误 我不知道我的问题出在哪里 请让我知道代码的问题,它是一个指向字符串的指针数组, 它位于指向结构的指针中 # include <stdio.h> #include <stdlib.h> # include <string.h> char *sum(char **sol) ; char *summer_sum(char*** solcs) ; int main() { char* datum ="t

我正在学习c语言的指针 我写了一个小程序,但我犯了错误 我不知道我的问题出在哪里 请让我知道代码的问题,它是一个指向字符串的指针数组, 它位于指向结构的指针中

# include <stdio.h>
#include <stdlib.h>
 # include <string.h>
char   *sum(char **sol) ;
 char  *summer_sum(char*** solcs) ;
int main()
{
char* datum ="teststring";
sum(&datum);
}


char *sum(char** sol)  
{
printf("\n   value is : %s",*sol);
summer_sum(&sol);
return "1" ; 
}

char *summer_sum(char***  solcs)  
{
int i=0;
typedef struct
{
char *asg[40];
}nlist;
nlist *n1;
for( i=0 ; i<= 38 ;i++)
{ 
n1->asg[i] = calloc(1,1*sizeof(*solcs));
strcpy(n1->asg[i],**solcs);
printf("\n %d value is : %s",i,n1->asg[i]);
} 

return NULL; 
}
#包括
#包括
#包括
字符*总和(字符**sol);
char*summer_sum(char***solcs);
int main()
{
char*datum=“teststring”;
总和(和基准);
}
字符*总和(字符**sol)
{
printf(“\n值为:%s”,*sol);
夏令营及夏令营;
返回“1”;
}
char*summer_sum(char***solcs)
{
int i=0;
类型定义结构
{
char*asg[40];
}nlist;
nlist*n1;
对于(i=0;iasg[i]=calloc(1,1*sizeof(*solcs));
strcpy(n1->asg[i],**solcs);
printf(“\n%d值为:%s”,i,n1->asg[i]);
} 
返回NULL;
}

n1
未初始化时使用:

n1->asg[i] = calloc(1,1*sizeof(*solcs));
另一方面,如果要为strcpy的使用分配足够的空间,则必须使用strlen而不是sizeof

您不需要双指针或三指针,您的代码简化了:

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

void sum(char *sol);
char *summer_sum(char *solcs);

int main(void)
{
    char *datum = "teststring";
    sum(datum);
}

void sum(char *sol)  
{
    printf("\n   value is : %s", sol);
    summer_sum(sol);
}

char *summer_sum(char *solcs)  
{
    int i = 0;
    size_t len;
    typedef struct {
        char *asg[40];
    } nlist;

    nlist *n1 = malloc(sizeof(*n1));
    if (n1 == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    len = strlen(solcs); /* No need to compute len on each iteration */
    for (i = 0; i <= 38; i++) { /* you are filling 39 and declared 40 */
        n1->asg[i] = calloc(1, len);
        /* Always check the result of (m/c/re)alloc */
        if (n1->asg[i] == NULL) {
            perror("malloc");
            exit(EXIT_FAILURE);
        }
        strcpy(n1->asg[i], solcs);
        printf("\n %d value is : %s", i, n1->asg[i]);
        /* Don't forget to free */
        free(n1->asg[i]);
    }
    free(n1);
    return NULL; 
}
#包括
#包括
#包括
无效金额(char*sol);
char*summer_sum(char*solcs);
内部主(空)
{
char*datum=“teststring”;
总和(基准);
}
无效金额(char*sol)
{
printf(“\n值为:%s”,sol);
夏令营(sol);;
}
char*summer_sum(char*solcs)
{
int i=0;
尺寸透镜;
类型定义结构{
char*asg[40];
}nlist;
nlist*n1=malloc(sizeof(*n1));
如果(n1==NULL){
佩罗尔(“马洛克”);
退出(退出失败);
}
len=strlen(solcs);/*无需在每次迭代中计算len*/
对于(i=0;i asg[i]=calloc(1,len);
/*始终检查(m/c/re)alloc的结果*/
如果(n1->asg[i]==NULL){
佩罗尔(“马洛克”);
退出(退出失败);
}
strcpy(n1->asg[i],solcs);
printf(“\n%d值为:%s”,i,n1->asg[i]);
/*别忘了自由*/
免费(n1->asg[i]);
}
自由(n1);
返回NULL;
}

您正在使用未初始化的指针
n1
。您的程序调用未定义的行为。在这种情况下,您可能会得到预期或意外的结果。

其次,在使用
n1->
之前,您在函数
summer\u sum

中缺少一个右括号
。。您将有两个问题涉及到代码中的动态内存分配:

  • n1
    未初始化,您应该在
    summer\u sum()中的
    for
    语句之前添加一条语句,如
    n1=malloc(sizeof(*n1));
  • 您没有为每个
    asg[i]
    分配足够的空间,您应该通过
    n1->asg[i]=malloc(strlen(**solcs)+1)为这些
    asg[i]
    分配空间;

  • 如果根本没有使用返回类型,那么有什么理由使用返回类型为
    char*
    ?另外,如果您使用的是动态内存,请使用一些动态内存调试器工具,如。Pro提示:不要使事情过于复杂,这不会使您或您的代码变得更好。尝试调试代码以查看错误发生的位置和原因?