程序需要简单地从键盘填充动态分配的矩阵。 我必须补充说,我包括在内。我正在研究C ++编译器,因此我必须将转换添加到malloc。它似乎有这样的错误:“ConsoleApplication42.exe中0x0F92FB53(msvcr120d.dll)的未处理异常:0xC0000005:访问冲突读取位置0xCDCDCDCD。”到达得到(a [i])命令。 经过调试后,似乎在自由序列中也有一个非常合适的问题。
int main()
{
int n, i;
char **a;
printf("introduceti numarul de cuvinte:\n");
scanf("%d", &n);
a = (char**)malloc(n*sizeof(char*));
if (!a)
printf("alocare nereusita");
for (i = 0; i < n; i++);
{
a[i] = (char*)malloc(56 * sizeof(char));
}
for (i = 0; i < n; i++)
{
printf("introduceti urmatorul cuvant:\n");
gets(a[i]);
}
for (i = 0; i < n; i++)
free(a[i]);
free(a);
return 0;
}
答案 0 :(得分:4)
在第一个for循环标题之后你有一个额外的分号!
答案 1 :(得分:0)
上面的答案是正确的。
由于额外;
,您正在执行a[n] = ...
,这显然是内存访问冲突。
此外,如果用户输入超过55个字符,您的代码仍会执行其他内存访问冲突。因此,建议您使用以下代码替换gets(a[i])
:
#include <conio.h>
#define MAX_SIZE (56-1)
#define ALLOWED_CHAR(c) (32 <= (c) && (c) <= 255)
int j = 0;
while (1)
{
int c = _getch();
if (j < MAX_SIZE && ALLOWED_CHAR(c))
{
a[i][j++] = (char)c;
printf("%c",(char)c);
}
else if (j > 0 && c == '\b')
{
j--;
printf("\b \b");
}
else if (j > 0 && (c == '\r' || c == '\n'))
{
a[i][j] = 0;
break;
}
}
如果您想限制用户输入,可以重新定义ALLOWED_CHAR
,例如:
#define ALLOWED_CHAR(c) ('0' <= (c) && (c) <= '9') // only digits
#define ALLOWED_CHAR(c) ('A' <= (c) && (c) <= 'Z') // only capital letters