printf char数组段错误C.

时间:2016-11-21 14:26:51

标签: c segmentation-fault

所以我编写了一个代码,按照正确的顺序对单词进行排序。这些单词是通过指针存储的,我在程序中初始化了另一个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

3 个答案:

答案 0 :(得分:1)

您的代码中存在多个问题

  1. a[i - 1] = tolower(argv[i])错误,因为tolower()int作为参数并且您正在传递char *,因此它将指针转换为int在c中是合法的,但不保证定义的行为。

  2. 您没有在'\0'数组上设置a终结符,这是造成问题的另一个原因,特别是当您尝试将其用作字符串时,char数组不是字符串,除非,它是一个带有终止'\0'字节的可打印字节序列。

  3. 分配argc - 1不起作用,因为

    • argc的值是可执行文件的传递参数数。
    • 如果它是argv所找到的相应strlen()的长度,则需要1个字节而不是更少,所以在任何情况下都是argc + 1

答案 1 :(得分:0)

你为什么使用%s

for(i = 0; i < argc-1; i++){
printf("%s", a[i]);

尝试%c

答案 2 :(得分:0)

你的编译器也应该给你一个警告:

printf("%s", a[i]);
  

警告:format指定类型'char *'但参数具有类型         'char'[-Wformat]

如果您将其更改为%c,则正常

正如警告所说,当你使用它%s时,printf期待一个字符串或char*,并将其视为这样。 a[i]是一个整数类型,可以引用内存中的无效位置。因此,正确的方法是使用%c,并打印一个字符;或使用%s并传递char *作为第二个参数。

或者你想要args in a。改变退场。

char *a[argc-1];

然后更改作业。

a[i-1] = argv[i];