【问题标题】:Segmentation fault in string copying字符串复制中的分段错误
【发布时间】:2012-10-25 01:40:22
【问题描述】:

我收到内部 while 循环的分段错误错误。

char **c;
c=(char **)malloc(3*(N-1)*sizeof(char *));

for(int i=0;i<3*(N-1);)
{
    char *temp;
    gets(temp);
    while(*temp!='$')
    {
        j=0;
        while(*temp!=' ')
        {
            *(c[i]+j)=*(temp+j);
            j++;
        }
        i++;
    }
    i++;
}        

抱歉缩进不当。我知道操作 char * 字符串会导致错误。但我不确定这个错误。我试图将 tmp 字符串分成三个不同的字符串。

【问题讨论】:

  • 您应该使用所有警告和调试信息进行编译(例如,在 Linux 上使用 gcc -Wall -g)并使用调试器(例如,在 Linux 上使用 gdb)。学习使用调试器(和编译器)实际上是学习 C 编程过程的一部分。您可能还想使用内存泄漏检测器,例如 valgrind
  • 您还应该避免使用gets,这是一个不推荐使用的危险函数(并已从最新的C中删除标准)。您可以使用getlinefgets

标签: c pointers segmentation-fault strcpy


【解决方案1】:

您只为3 * (N - 1) 字符串指针分配空间,但没有为字符本身分配空间。 temp 指针也未初始化,但您仍在使用 gets() 编写它。这会导致未定义的行为。

另外,你shouldn't cast the return value of malloc(),在 C.

【讨论】:

  • 我想我们不必为 char * 分配空间
【解决方案2】:

没有为temp 变量分配内存。

char *temp;
gets(temp);

【讨论】:

  • 是的。否则,指针将指向某个垃圾位置。因此,当您尝试引用它时,会发生段错误。动态或静态说char temp[100];
【解决方案3】:

1) temp 应该是一块内存(缓冲区)来复制gets 字符串。

char *temp = malloc (256 * sizeof(char)); /* 256 as example*/

2) 为线

while(*temp!='$')

while(*temp!=' ')

我们希望为两个循环找到temp 指针(例如temp++)的一些增量,但没有。这会导致问题

如果我能猜到你的需要,在你的代码修复建议之后(我没有测试它)

char **c;
c=(char **)malloc(3*(N-1)*sizeof(char *));

char copy[256];
char temp[256], *p;

for(int i=0;i<3*(N-1);i++)
{
    p = temp;
    gets(p);
    while(*p!='$')
    {
        j=0;
        while(*p!=' ')
        {
            *(copy+j)=*p;
            j++;
            p++;
        }
        if(*p=='\0')
            break;
        p++;
    }
    copy[j] = '\0'
    c[i] = strdup(copy); // allocate memory with size of copy string and then copy the content of copy to allocated memory
}  

【讨论】:

  • 谢谢。你能告诉我如何在事先不知道它的大小的情况下输入一个字符串吗?
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 2013-12-06
  • 2012-11-14
  • 2019-05-16
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多