7

在下面的代码中,该行:

*end = *front;

给出分段错误。我在这里问了一个类似的问题,但我不确定这是否是因为我有两个 num 副本。请解释为什么它是段错误。谢谢你。

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

char* getPalin(char* num);

int main()
{
    char* num = (char*)malloc(100);

    num = "123456";

    printf("%s\n", getPalin(num) );

    return 0;
}

char* getPalin(char* num)
{
    int length = strlen(num);

    if ( length % 2 == 0 )
    {
        char* front = num;
        char* end = num + strlen(num) - 1;  //pointer to end

        while( front != num + (length/2) )  //pointers not middle yet
        {
            *end = *front;

            printf("%c", *end);

            front++;
            end--;
        }
    }

    return num;
}
4

4 回答 4

19

这两行:

char* num = (char*)malloc(100);
num = "123456";

有以下效果。

第一个分配 100 个字节并设置num为指向这些字节。

第二个更改 num 以指向字符串“123456”,该字符串几乎可以肯定在只读内存中。

任何更改只读内存内容的尝试都将导致分段违规。在尝试更改它之前,您需要将字符串复制到malloc'd中,使用:num

strcpy (num, "123456");

这就是您当前应该拥有的行:

num = "123456";
于 2009-06-03T06:28:25.583 回答
4

采用

strncpy(num, "123456", 100);

代替

num = "123456";
于 2009-06-03T06:24:16.137 回答
1

根据康斯坦丁的回答。

您已经使用 malloc 语句为 num 分配了内存。

如果你没有,那么你可以逃脱:

char* num = "123456";

它将动态定义和分配内存,但它很可能被分配为常量,因此是只读的。

使用 strncpy 而不是 strcpy 复制“123456”将确保字符串空终止符末尾之外的任何额外空间也初始化为空,只要您将 n 指定为 100(例如)。否则,如果不将 malloc 分配的内存初始化为 null (memset(num, 0, 100)),那么可以想象您可以超出字符串的末尾。

哦差点忘了。建议使用 strcpy_s 或 strncpy_s,因为它们更安全,尽管对于您的代码来说这无关紧要。

于 2009-06-03T06:46:00.590 回答
0

错误的原因是:

  char* num = (char*)malloc(100);

在这一行中,您已将 num 声明为指向数组的指针或指向其第一个元素的指针,而不是字符串。

 num = "123456";

这一行您在将其声明为字符串时使用了 num。这是违反分段的,因此是分段错误。您的代码的首选(正确)语法是:

   char num[100];
   strcpy(num,"123456"); //Even if you use num="123456"; here it would still be wrong

或者

  char* num = (char*)malloc(100);
  strcpy(num,"123456");

或者

  char num[100]={'1','2','3','4','5','6'};

这些中的任何一个都可以完成您的工作。

于 2012-10-13T21:04:27.567 回答