簡體   English   中英

C 打印不同的東西時出現分段錯誤

[英]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';
}

但是,您應該考慮根本不重新實現標准庫函數。 這是因為您的實現可能是不安全和錯誤的(確實如此)。 此外,這些功能是由聰明的開發人員編寫的,並且經過優化和深思熟慮,因此最好堅持使用它們。

  • function 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_avec_b的第 0、第 4 和第 8 個元素(假設sizeof(int)為 4)。 arrays 的大小都是 3 所以索引范圍是從02

  • 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.

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