簡體   English   中英

使用指針進行字符串連接中的分段錯誤

[英]Segmentation fault in string concatenation using pointers

我試圖連接存儲在字符指針中的兩個字符串,但我做錯了。 有人可以指出它是什么嗎? 另外,我沒有故意使用任何內置功能。

int main()
{
    char *a = "abc";
    char *b = "def";
    char *c;

    while(*a != '\0')
    {
        *c = *a;
        a++;
        c++;
    }

    while(*b != '\0')
    {
        *c = *b;
        b++;
        c++;
    }

    *c = '\0';
    c -= 6;

    while(*c!= '\0')
    {
        printf("%c", *c);
        c++;
    }

    return 0;

}

你沒有為c分配任何內存

當你這樣做時, bc靜態分配內存:

char *a = "abc";
char *b = "def";

但是c沒有那個,所以你需要使用類似的東西來分配內存:

char *c = malloc (x);

其中x是您需要容納要插入的字符的字符數組的總長度(加1,終止NULL)。 你還需要記住在某個地方free ()它。

由於你沒有做任何分配,這一行:

*c = *a;

將產生未定義的行為。

c未初始化。 您必須在復制值之前對其進行初始化。 例如:

char *c = malloc(strlen(a) + strlen(b) + 1); /* plus 1 for terminating null byte */
if (!c) {
    perror("malloc");
    exit(EXIT_FAILURE);
}

其他問題是您在打印時沒有增加c

   while(*c!= '\0')
    {
        printf("%c", *c);
        c++;
    }

請注意這個聲明

c -= 6;

這里很好,但不是很可讀。 最好使用臨時指針來保存c的初始位置,這樣就不需要這樣做了。

如果你不能使用標准的strlen函數,那么你可以直接自己實現它。

 char *c; 

使用此行,您可以定義一個變量c ,它是指向char的指針。 很明顯,你的想法是在其中存儲字符串ab的串聯; 但是,要做到這一點,你需要為結果'a+b' (串聯)字符串提供一些內存

你要做的是為目標字符串分配足夠的內存,計算要連接的兩個源字符串中的字符,以及終止NUL\\0 )。 在您的情況下,結果字符串需要3 + 3 + 1 = 7 char

您可以在堆棧上分配它們,如下所示:

char result[7];

或者使用malloc()動態分配。 在這種情況下,您還需要釋放調用free()的內存。

您正在收到錯誤,因為指針c未初始化。

int main()
{
char *a = "abc";
char *b = "def";
char x ;
char *c = &x; //initializing pointer

while(*a != '\0')
{
    *c = *a;
    a++;
    c++;
}

while(*b != '\0')
{
    *c = *b;
    b++;
    c++;
}

*c = '\0';
c -= 6;

while(*c!= '\0')
{
    printf("%c", *c++);//increment pointer
}
return 0;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM