[英]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庫中已經有兩個函數memmove
和memcpy
。 如果源區域和目標區域重疊,則memmove
很有用。 如果您知道它們永遠不會重疊,則memcpy
可能會更快。
最后,我想指出的是,您不應該接受Artur關於未初始化指針使用的建議。 您永遠不要依賴未初始化指針的值,這樣做意味着程序的行為沒有明確定義。 C語言規范的附件J提到了以下未定義行為 :
J.2未定義行為
- 在以下情況下,行為是不確定的:
- ...
- 具有自動存儲持續時間的對象的值在不確定時使用。
- ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.