【问题标题】:array of pointers to string , segmentation fault occurs指向字符串的指针数组,发生分段错误
【发布时间】:2014-01-02 11:52:06
【问题描述】:

我正在学习 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; 
}

【问题讨论】:

  • 有什么理由将返回类型用作 char * ,什么时候根本不使用?此外,如果您正在使用动态内存,请习惯使用一些动态内存调试器工具,例如 valgrind
  • 专业提示:不要让事情过于复杂,它不会让你或你的代码变得更好。
  • 尝试调试您的代码以查看错误发生的位置和原因?

标签: c pointers gcc libc


【解决方案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; 
}

【讨论】:

    【解决方案2】:

    在使用 n1-&gt;... 之前,您还需要使用 calloc()n1 分配内存

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-08
          • 1970-01-01
          • 1970-01-01
          • 2021-03-24
          • 2014-11-29
          相关资源
          最近更新 更多