为什么此代码会出现分段错误?

时间:2014-11-17 06:09:26

标签: c segmentation-fault

我正在尝试编写一个从字符串src中删除char c的函数,当我尝试运行它时,我遇到了一个seg错误。这是功能。

void removeChar(char *src, char c){
  int i, j = 0;
  int size;
  char ch1;
  char str1[100];

  size = strlen(src);

  for (i = 0; i < size; i++){
    if (src[i] != c){
      ch1 = src[i];
      str1[j] = ch1;
      j++;
    }
  }
  str1[j] = '\0';
  src = str1;
}

这是我称之为的主要功能。

int main(int argc, char **argv){
    char *str = "Hello, world!\0";
    printf("%s\n", removeChar(str, 'l'));
}

5 个答案:

答案 0 :(得分:2)

此函数removeChar(str, 'l')的返回类型为void而不是char数组,并且您将其传递给

  

printf(&#34;%s \ n&#34;,removeChar(str,&#39; l&#39;));

所以这里%s可能会给你分段错误。

答案 1 :(得分:2)

您通过本地数组的第一个元素的地址

分配了指针src
  src = str1;

退出函数后将被销毁。此外,变量src是函数的局部变量,因此它的任何更改都不会影响原始指针str。

考虑到您可能不会更改字符串文字。任何更改字符串文字的尝试都会导致程序的未定义行为。

此函数的返回类型为void,并且不能用作函数printf中的输出对象。 类型void是不完整的类型。它没有价值。

并且不需要像你那样将字符串文字明确地终止为零。

"Hello, world!\0"

字符串文字已经有终止零。所以你可以简单地写一下

"Hello, world!"

由于我已经回答了这个问题,你可以访问my personal forum,其中有相应的有效功能。

如果要正确声明像

这样的功能
char * removeChar( char *s, char c );

然后主要看起来如下

int main(int argc, char **argv)
{
    char str[] = "Hello, world!";
    printf( "%s\n", removeChar( str, 'l' ) );
}

答案 2 :(得分:1)

您可以在函数本身中打印字符串!然后它工作:

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

void removeChar(char src[], char c){
  int i, j = 0;
  int size;
  char ch1;
  char str1[100];

  size = strlen(src);

  for (i = 0; i < size; i++) {
    if (src[i] != c) {
      ch1 = src[i];
      str1[j] = ch1;
      j++;
    }
  }
  str1[j] = '\0';
  src = str1;

  printf("%s\n", src);

}

int main(int argc, char **argv) {

    char str[] = "Hello, world!";
    removeChar(str, 'l');

    return 0;

}

答案 3 :(得分:1)

你有几个错误:

  1. char *str = "Hello, world!\0";。设置指向字符串文字的非常量指针总是错误的。相反,将变量声明为const char *str。请参阅此FAQ

  2. removeChar不会返回任何内容,因此您无法将其作为printf打印的参数传递。你的编译器真的应该在这里抱怨。有可能是您的编译器配置错误,或者您在启用所有警告的情况下都没有使用它。

  3. char str1[100];您无法使用局部变量,然后尝试将内容传递给调用者。请参阅此FAQ

  4. src = str1;没有做任何事情,因为src只是原始指针的本地副本。通过此分配,您不会更改main中str的地址。无论如何,这将是一个错误,因为上面的3)。您应该重写您的程序,以便只使用src而不使用临时数组。

答案 4 :(得分:0)

没有足够的声誉来发表评论。所以,我不得不写下这个回答:

来自莫斯科的Vlad 指出,

`a local array do not exist after the function terminate`

我建议你遵循与标准库函数相同的原则。如果您还没有注意到,则没有 string.h 函数为用户分配内存。您必须在致电前分配。

char *str = "Hello, world!\0";

上述代码不保证可修改的内存。编译器可以将它们设置在只读存储器中。你应该使用数组。