[英]C segmentation fault when printing different things
我目前正在為一個學校項目制作一些功能。 單獨運行每個 function 並打印它們時,我沒有錯誤,但是當我打印 main 中所有函數的結果時,我得到最后一個 function Z78E6221F6393D1356681DBCEZF 的分段錯誤。
我的源代碼可以在這里找到。 這是不起作用的主要部分:
int main() {
char str1[] = "382 is the best!";
char str2[100] = {0};
strcpy(str1, str2);
puts(str1);
puts(str2);
int vec_a[3] = {12,34,10};
int vec_b[3] = {10,20,30};
int dot = dot_prod((char*) vec_a, (char*) vec_b, 3, sizeof(int));
printf("%d\n", dot);
int arr[3] = {0x12BFDA09, 0x9089CDBA, 0x56788910};
sort_nib(arr, 3);
for (int i = 0; i < 3; i++) {
printf("0x%08x ", arr[i]);
}
printf("\n");
return 0;
}
運行此代碼段時,我得到了正確的 output 除了最后的打印循環,我得到了分段錯誤。 但是,如果我注釋掉 puts 語句和 printf(dot),最終的打印循環就會起作用。
任何幫助是極大的贊賞
您的代碼有一些問題:
strcpy()
function 不正確,因為它沒有在dst
末尾添加 NULL 終止符。 還有語句dst[i] = src[0];
只是將src
的第 0 個元素復制到dst
的第 i 個索引,這是不正確的。 您還使用了goto
語句而不是令人困惑的循環。 總的來說,這個函數邏輯是不正確的,沒有意義。更好的實現是:
void mystrcpy(char *dest, const char *src)
{
while (*src) {
*dest = *src; // These lines can be
dest++; // Rewritten into one line:
src++; // *dest++ = *src++
}
*dest = '\0';
}
但是,您應該考慮根本不重新實現標准庫函數。 這是因為您的實現可能是不安全和錯誤的(確實如此)。 此外,這些功能是由聰明的開發人員編寫的,並且經過優化和深思熟慮,因此最好堅持使用它們。
dot_prod
存在緩沖區過度讀取錯誤。 在以下代碼中:int dot_prod(char* vec_a, char* vec_b, int length, int size_elem)
PRODLOOP:
if (i <= (length - 1) * size_elem) {
int elema = (int) vec_a[i];
int elemb = (int) vec_b[i];
product += elema * elemb;
i += size_elem;
goto PRODLOOP;
}
這是您在main()
) 中傳遞給dot_prod()
) 的內容:
int vec_a[3] = {12,34,10};
int vec_b[3] = {10,20,30};
int dot = dot_prod((char*) vec_a, (char*) vec_b, 3, sizeof(int));
因此,您正在訪問vec_a
和vec_b
的第 0、第 4 和第 8 個元素(假設sizeof(int)
為 4)。 arrays 的大小都是 3 所以索引范圍是從0
到2
。
sort_nib()
function 在以下代碼中調用未定義的行為:char* a[9];
char* s;
int k = 0;
CONVERT:
if (k < length) {
if (k == 0) {
sprintf((char*) s, "%08X", arr[k]);
} else {
sprintf((char*) a, "%08X", arr[k]);
s = combine(s, (char*) a);
}
s
是一個未初始化的指針, a
是一個同樣未初始化的指針數組。 因此對它們調用sprintf()
會調用未定義的行為,因為它們不指向任何東西。
sort_nib()
function 使用goto
語句而不是循環,這很令人困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.