分段故障11错误输出

时间:2015-02-03 08:17:53

标签: c string pointers segmentation-fault

我目前正在进行段错,我似乎无法弄清楚为什么...... 我正在制作一个连接字符串值的代码:

char* concat(char** strs, unsigned int nstrs)
{
  char* newstring;
  int length = 0;
  int j;
  int charcount;
  int strcount;
  int k = 0;
  for (j = 0; j <= nstrs - 1; j++) {
    length = sizeof(strs[j]) + length;
  }
  newstring = malloc(length);
  for (strcount = 0; strcount <= nstrs - 1; strcount++) {
    for (charcount = 0; charcount <= strlen(strs[strcount]) - 1; charcount++)     {
      newstring[k] = strs[charcount][strcount];
      k++;
    }
  }
  return newstring;

在我的主要功能中,我有......

  char* introname[] = {"My", "name", "is", "Trill-o"};
  printf("%s\n", concat(introname, 4));

5 个答案:

答案 0 :(得分:2)

在您的代码中,您需要更改

sizeof(strs[j])

strlen(strs[j])

永远记住,sizeof不是一个功能,它是一个操作员。它返回提供的数据类型的大小。在您的代码中,strs[j]的类型为char *,因此sizeof将返回等于sizeof(char *)的值。

要获取字符串长度,您必须使用strlen()

那就是说,请注意,strlen()不包括终止null的计数。因此,在length中使用malloc()时,您需要为一个字节添加空格,例如

  newstring = malloc(length + 1);    // 1 more byte for storing the terminating null.

此外,您必须检查malloc()的返回值以确保成功。如果malloc()失败,它将返回NULL,后续使用newstring将导致UB。

根据逻辑部分,您的代码应该是

 newstring[k] = strs[strcount][charcount];

并正确终止字符串

newstring[k] = '\0' ;

for循环之外。

答案 1 :(得分:1)

sizeof(strs[j])
函数中的

sizeof(pointer)而不是sizeof(array) 但是因为你有一个字符串使用strlen(strs[j])来获取字符串的长度。

请注意将内存分配给\0字符。

答案 2 :(得分:1)

不要使用sizeof来获取字符串的长度。

你需要使用strlen。

 sizeof(strs[j]) ; // bad, will return the sizeof pointer which is 4 or 8 depending on the system
 strlen(strs[j]); // this is what you want.

答案 3 :(得分:0)

C字符串也是 null 终止的字符数组。确保连接的字符串末尾有\ 0。这是一个工作版本:string concatenation

注意我也切换了数组的索引。我想这就是你想要的。

newstring = malloc(length + 1); // for '\0' character
...
newstring[k] = strs[strcount][charcount];
...
newstring[length] = '\0' ;

答案 4 :(得分:0)

你的主要问题在于:

    length = sizeof(strs[j]) + length;

sizeof没有给出字符串所需的长度,因为它是char *,而不是数组。你想要的是strlen(strs[j]))

此外,当您完成长度总计后,请在NUL之前为终止malloc添加一个。{/ p>

最后:

  newstring[k] = strs[charcount][strcount];

应该是

  newstring[k] = strs[strcount][charcount];