0

正如标题所示,这应该很容易。我不明白为什么,但是当我运行它时出现 Bus error: 10。

这应该很容易!但我似乎无法解决它......呃。请帮忙。

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

main() {

char *string[20];
char buffer[256];

int wordCount = 0;

    while ((scanf("%s", buffer) != EOF)) {
        printf("%s%d\n", buffer, wordCount);
        string[wordCount++] = (char *) malloc (strlen(buffer)+1); 
        strcpy (string[wordCount], buffer);
    }

int j;

printf("There are %d words.\n", wordCount+1);

for (j = 0; j < wordCount; j++)
{

    printf("%s\n", string[j]);
}   
}
4

3 回答 3

3
string[wordCount++] = (char *) malloc (strlen(buffer)+1); 
strcpy (string[wordCount], buffer);

你分配给string[wordCount]然后你增加wordCount. 然后你继续到strcpy这个新的、未分配的元素,这是非法的。

改为wordCount 之后 递增。strcpy

于 2012-09-07T21:44:00.950 回答
0

您应该遇到的另一个问题是,如果您阅读超过 20 行,您将进行非法内存访问,因为您声明了一个具有 20 个位置的 char 指针数组:

字符*字符串[20];

您应该重新考虑循环:

while ((scanf("%s", buffer) != EOF))

于 2012-09-08T04:42:55.240 回答
0

您应该检查数组(索引)溢出,例如:

int main() {

char *string[20];
char buffer[256];

int j, wordCount = 0;

    while (wordcount<20 && (scanf("%255s", buffer) == 1)) {  /* here */
        printf("%s%d\n", buffer, wordCount+1);
        strcpy( string[wordCount++] = malloc (strlen(buffer)+1, buffer ); 
    }

printf("There are %d words.\n", wordCount+1);

for (j = 0; j < wordCount; j++)
{

    printf("%s\n", string[j]);
}
  return 0;
}

请注意,scanf 将在所有空格上中断,并且在所有 scanf/fgets(stdin) 操作之后清除输入缓冲区。

于 2012-09-08T07:54:49.593 回答