[英]printf char array segment fault C
所以我寫了一段代碼,以正確的順序對單詞進行排序。 單詞是通過指針存儲的,我已經在程序中初始化了另一個char數組,以存儲char* argv
。
最后一個for循環是打印段錯誤的原因,我不知道為什么。
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
int i, j;
char *key;
char a[argc-1];
for(i=1; i < argc; i++){
a[i-1]= tolower(argv[i]);
}
for (i = 2; i < argc; i++) {
key = argv[i];
j = i-1;
while (j >= 1 && strcmp(argv[j], key) > 0) {
argv[j+1] = argv[j];
j--;
}
argv[j+1] = key;
}
for(i = 1; i < argc; i++){
a[i-1] = *argv[i];
}
for (i = 1; i < argc ; i++){
puts(argv[i]);
}
for(i = 0; i < argc-1; i++){
printf("%s", a[i]);
}
return 0;
}
輸入
./a.out orange banana apple
輸出
apple
banana
orange
Segmentation fault
您的代碼中存在多個問題
行a[i - 1] = tolower(argv[i])
是錯誤的,因為tolower()
將int
作為參數,並且您要傳遞char *
因此它將指針轉換為int
,這在c中是合法的,但不能保證定義的行為。
您沒有設置'\\0'
上終止a
數組這是另一種原因的問題,特別是當您嘗試使用它作為一個字符串,一個char
數組不是字符串,除非它是可打印的字節與終止序列'\\0'
字節。
分配argc - 1
不起作用,因為
argc
的值是傳遞給可執行文件的參數數。 strlen()
找到的相應argv
的長度,則需要不小於1個字節,因此在任何情況下argc + 1
。 為什么使用%s
for(i = 0; i < argc-1; i++){
printf("%s", a[i]);
嘗試%c
您的編譯器還應警告您:
printf("%s", a[i]);
警告:format指定類型為'char *',但是參數為類型'char'[-Wformat]
如果將其更改為%c
則可以正常工作 。
如警告所言, %s
printf在使用它時期望字符串或char*
,並將其視為此類。 a[i]
是一個整數類型,可以引用內存中的無效位置。 因此,正確的方法是使用%c並打印一個字符; 或使用%s並將char *作為第二個參數傳遞。
或您可能想要args的性能。 更改任務。
char *a[argc-1];
然后更改分配。
a[i-1] = argv[i];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.