簡體   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