1

我想在 2 个单独的数组中解析用户输入(使用 scanf)。g++ 编译没有错误,但我得到一个内存访问错误(核心转储)。(德语:“Speicherzugriffsfehler (Speicherabzug geschrieben)”)

char *top[10];
char *bottom[10];

for(i = 0; i < 5; i++){
    printf("Karte %d: Obere Werte? ", i );
    scanf( "%s", top[i] );
    printf( "Karte %d: Untere Werte? ", i);
    scanf( "%s", bottom[i] );
}

这里有什么问题?我尝试使用"stringcpy"temp-var ("stringcpy(top[i], temp)"),但它也不起作用。

有什么建议么?

4

3 回答 3

8

你还没有为你的字符串分配内存。您提供给 scanf 的参数是未初始化的指针。

top[i] = "test"分配一个指向您的变量的指针并使用有效值对其进行初始化。

相反,scanf(..., top[i])尝试写入 wheretop[i]点。但未top[i]初始化并指向某个随机位置,这会导致您的内存访问错误。

当您查看man scanf时,您可以阅读以下内容

Conversions
...
s
匹配一系列非空白字符;

现在是重要的部分

下一个指针必须是一个指向字符数组的指针,它的长度足以容纳输入序列和自动添加的终止空字节 ('\0')。

因此,您必须通过分配一个数组malloc()或声明足够大的字符数组。

char top[10][21];
char bottom[10][21];
int i;
for(i = 0; i < 5; i++){
    printf("Karte %d: Obere Werte? ", i);
    scanf("%20s",top[i]);
    printf("Karte %d: Untere Werte? ", i);
    scanf("%20s",bottom[i]);
}

scanf("%20s",top[i]);

您限制读取的字符数,以防止缓冲区溢出

于 2012-11-22T20:58:25.397 回答
2

正如另一个答案所说,您必须为字符串分配位置。您想要一个顶部和底部字符串的数组,但char * top[10]您只为 10 个指针分配空间,而不是为字符串中的字符分配空间。起作用的原因top[10] = "Hello"是编译器隐式分配了字符串文字,编译器返回指向这些字符的指针。

char *top[10], *bottom[10];
for(i = 0; i < 5; i++)
{
    top[i] = malloc(100); // reserve room for string up to 100 chars
    printf("Karte %d: Obere Werte? ", i);
    scanf("%s",top[i]);
    bottom[i] = malloc(100);
    printf("Karte %d: Untere Werte? ", i);
    scanf("%s",bottom[i]);
}
于 2012-11-22T21:04:41.783 回答
0

你所拥有的是一个指针数组。您需要为数组中的每个指针分配内存。

您可以在之前执行以下操作scanf

top[i] = malloc(sizeof(char)*255);
bottom[i] = malloc(sizeof(char)*255);

使用后不要忘记释放。

free(top[i]);
free(bottom([i]);
于 2012-11-22T21:10:16.813 回答