簡體   English   中英

為什么復制內存時出現分段錯誤

[英]why segmentation fault when copying memory

我在x86_32上運行ubuntu ...,並且在運行該程序時不斷出現分段錯誤。

enter code here
#include<stdio.h>
#include<stddef.h>
char *memcp(char *dest, const char *src, size_t n)
{

    char *dp = dest;
    const char *sp = src;
    while(n--)
        *dp++ = *sp++;
    return dest;

}

int main()
{

    char *s = "abcde";
    char *d;
    char *r = memcp(d,s,6);
    printf("%s",r);

    return(0);
}

此代碼的問題在於,它在Windows和ubuntu上我朋友的x86_64計算機上運行。 請幫幫我..

至少有兩種方法可以做到這一點:

malloc方法:

int main(void)
{
    char *s = "abcde";
    char *d = malloc(6);
    char *r = memcp(d, s, 6);
    printf("%s",r);

    free(d);
    return(0);
}

數組方法:

int main(void)
{
    char *s = "abcde";
    char d[6];
    memcp(d, s, 6);

    return 0;
}

請注意,將緩沖區長度硬編碼到代碼中通常不是一個好主意(例如,您正在硬編碼6)。 如果輸入的大小發生變化,而您忘記更新數字6,則會出現問題。

出現分段錯誤的原因是因為指針d沒有指向任何地方。 在您的memcp函數中,您嘗試編寫此指針,但是因為它沒有指向有意義的程序崩潰的任何位置。 在C標准中,這稱為未定義行為 ,基本上它意味着任何事情都可能發生。

另外,您可能會感興趣的是,標准C庫中已經有兩個函數memmovememcpy 如果源區域和目標區域重疊,則memmove很有用。 如果您知道它們永遠不會重疊,則memcpy可能會更快。

最后,我想指出的是,您不應該接受Artur關於未初始化指針使用的建議。 您永遠不要依賴未初始化指針的值,這樣做意味着程序的行為沒有明確定義。 C語言規范的附件J提到了以下未定義行為

J.2未定義行為

  1. 在以下情況下,行為是不確定的:
    • ...
    • 具有自動存儲持續時間的對象的值在不確定時使用。
    • ...

暫無
暫無

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

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