簡體   English   中英

C - strcpy() 處的分段錯誤

[英]C - Segmentation fault at strcpy()

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *vStrs[] = {"Max", "Moritz", "Bolte", "Hans Huckebein", "Helene", "Antonius", "Boeck", "Maecke", "Lempel", "Schlich"};

int main()
{
    int num = sizeof(vStrs) / sizeof(vStrs[0]);
    int len = sizeof(vStrs[0]);
    char exchnge[len];
    char vBuf[128];
    char *ndata;
    int i, j;

    for(i=0; i<num-1; i++)
    {
        for(j=i+1; j<num; j++)
        {
            if(strcmp(vStrs[j], vStrs[i]) < 0)
            {
                strcpy(exchnge, vStrs[j]);
                strcpy(vStrs[j], vStrs[i]);
                strcpy(vStrs[i], exchnge);
            }
        }
    }

    for(i=0; i<num; i++)
        printf("%s\n", vStrs[i]);

    return 0;
}

大家好,

有誰知道為什么我在strcpy(vStrs[j], vStrs[i]);行出現分段錯誤strcpy(vStrs[j], vStrs[i]); ?

我有一個字符串數組,想對其進行排序。 但是我遇到了分段錯誤。 上面的 strcpy() 函數有效。 怎么了?

可能很明顯,但我不明白。

謝謝!

使用strcpy(vStrs[j], vStrs[i]) ,您可以將字符串文字的內容復制到另一個字符串文字中。 這就像你寫了strcpy("Max","Moritz") ,但字符串文字不能被修改(它的未定義行為)。

無論如何,您的程序的意圖是交換指向內容的指針,而不是內容本身。 因此,如果您按如下方式更改程序,則一切都應該沒問題:

char *vStrs[] = {"Max", "Moritz", "Bolte", "Hans Huckebein", "Helene", "Antonius", "Boeck", "Maecke", "Lempel", "Schlich"};

int main()
{
    int num = sizeof(vStrs) / sizeof(vStrs[0]);

    for(int i=0; i<num-1; i++)
    {
        for(int j=i+1; j<num; j++)
        {
            if(strcmp(vStrs[j], vStrs[i]) < 0)
            {
                char *exchnge = vStrs[j];
                vStrs[j] = vStrs[i];
                vStrs[i] =exchnge;
            }
        }
    }

    for(int i=0; i<num; i++)
        printf("%s\n", vStrs[i]);

    return 0;
}

...因為您沒有以最嚴格的錯誤檢查模式運行編譯器。

有些人認為-Wall意思是“所有警告”。 它沒有。 甚至-Wall -Wextra甚至都無法接近“可能的最嚴格的錯誤檢查模式”。 我會從-Wall -Wextra -pedantic -Wmissing-include-dirs -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Wno-system-headers -Wno-deprecated -Wunused-variable -Wunused-parameter -Wunused-function -Wunused ,然后參考手冊查找您的編譯器是否可以為您做更多。

如果您不使用 GCC,請根據您選擇的編譯器調整最后一段。 編譯器是你的朋友,給他一切可能的機會來防止你犯錯誤。

啟用這些選項后,您將收到以下警告:

警告:初始化從指針目標類型 [-Wdiscarded-qualifiers] 中丟棄“const”限定符

因為這是發生的事情:就語言標准而言, "Max"char *類型,但是 - 作為字符串文字 - 指向的內存是 non-writeable 這就是為什么您的機器上的strcpy()原因。 使用-Wwrite-strings ,您可以告訴編譯器將字符串文字改為char const * (就像使用 C++ 時那樣),從而使編譯器能夠在您忽略文字的不可寫性質時生成警告。

編譯器警告。 沒有他們,不要離開家。

暫無
暫無

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

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