簡體   English   中英

printf char數組段故障C

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

您的代碼中存在多個問題

  1. a[i - 1] = tolower(argv[i])是錯誤的,因為tolower()int作為參數,並且您要傳遞char *因此它將指針轉換為int ,這在c中是合法的,但不能保證定義的行為。

  2. 您沒有設置'\\0'上終止a數組這是另一種原因的問題,特別是當您嘗試使用它作為一個字符串,一個char數組不是字符串,除非它是可打印的字節與終止序列'\\0'字節。

  3. 分配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.

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