指向字符串的指针数组,发生分段错误

时间:2014-01-02 11:52:07

标签: 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 ="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; 
}

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您正在使用指针n1未初始化。您的程序调用未定义的行为。在这种情况下,您可能会得到预期或意外的结果 其次,您在函数}中缺少右括号summer_sum

答案 2 :(得分:0)

在使用n1->之前......您将使用n1

calloc()分配内存

答案 3 :(得分:0)

有两个问题涉及代码中的动态内存分配:

  1. n1未初始化,您应在n1 = malloc(sizeof(*n1));
  2. 中的for语句之前添加summer_sum()之类的语句
  3. 您没有为每个asg[i]分配足够的空间,您应该asg[i]
  4. 为这些n1->asg[i] = malloc(strlen(**solcs) + 1);分配空格