[英]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.