我正在学习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;
}
答案 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)
有两个问题涉及代码中的动态内存分配:
n1
未初始化,您应在n1 = malloc(sizeof(*n1));
for
语句之前添加summer_sum()
之类的语句
asg[i]
分配足够的空间,您应该asg[i]
n1->asg[i] = malloc(strlen(**solcs) + 1);
分配空格
醇>