繁体   English   中英

分段错误 - 字符指针

[英]Segmentation fault - char pointer

在下面的代码中,行:

*end = *front;

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

#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;
}

这两行:

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

有以下效果。

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

第二个将num更改为指向字符串“123456”,这几乎肯定是在只读存储器中。

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

strcpy (num, "123456");

这就是你现在应该拥有的那条线:

num = "123456";

采用

strncpy(num, "123456", 100);

代替

num = "123456";

根据康斯坦丁的回答。

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

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

char* num = "123456";

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

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

哦差点忘了。 建议使用strcpy_s或strncpy_s,因为它们更安全,但对于您的代码而言无关紧要。

出错的原因是:

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

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

 num = "123456";

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

   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'};

任何这些都可以完成你的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM