鉴于此任务:
编写一个程序,分配必要的内存量来存储来自两个
[m x n]
整数矩阵的元素。
我不知道如何为2维数组分配内存 我读了一些例子,但我没理解。
#define _CRT_SECURE_NO_WARNINGS
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define DIM 10
void main()
{
int **m, *n;
int i = 0, j = 0;
int diml, dimc;;
puts("Introduceti dimensiunea matricelor(linii|coloane)");
scanf("%d%d", &diml, &dimc);
m = (int**)malloc(dimc*sizeof(int));
puts("Introduceti elementele primei matrici:");
for (j = 0;j < dimc;j++)
{
m[i] = (int *)malloc(diml*(sizeof(int)));
}
for (j = 0;j < dimc;j++)
{
for (i = 0;i < diml;i++)
{
printf("tab[%d][%d]= ", j + 1, i + 1);
scanf("%*d", m[j][i]);
}
}
_getch();
}
我输入第一行后程序崩溃。
Introduceti dimensiunea matricelor(linhi I coloane)
3
3
Introduceti elementele primei matrici:
ab[1][1]= 2
ab[1][2]= 1
ab[1][3]= 2
ab[2][1]=
Problema 3.exe has stopped working
A problem caused the program to stop working correctly.
Windows will closethe program and notify you if a solution is
available.
答案 0 :(得分:3)
通过根据对象的大小而不是 type 的大小进行分配,避免使用错误的大小进行分配的错误。如果sizeof(int)
小于sizeof(int *)
,这将解释OP的问题。
// m = (int**)malloc(dimc*sizeof(int)); // Original
// m = (int**)malloc(dimc*sizeof(int *)); // corrected type
// m = malloc(dimc*sizeof(int *)); // cast not needed
m = malloc(sizeof *m * dimc); // best : sizeof object
使用正确的索引j
与i
@BLUEPIXY。这肯定是OP的问题。
for (j = 0;j < dimc;j++) {
// m[i] = (int *)malloc(diml*(sizeof(int)));
m[j] = malloc(sizeof *(m[j]) * diml);
确保编译器警告完全启用 - 它应该已经捕获了这个警告。
// scanf("%*d", m[j][i]);
scanf("%d", &m[j][i]);
建议检查malloc()
和scanf()
的结果。
#include <stdlib.h>
m[j] = malloc(sizeof *(m[j]) * diml);
if (m[j] == NULL && diml != 0)) {
fprintf(stderr", "Out of memory\n");
return EXIT_FAILURE;
}
if (scanf("%d", &m[j][i]) != 1) {
fprintf(stderr", "Non-numeric input\n");
return EXIT_FAILURE;
}
main()
应该返回int
。
#include <stdlib.h>
int main(void) {
...
return EXIT_SUCCESS;
}
促销时,确保输出打印并且不缓冲。使用fflush()
或以'\n'
结束提示。
printf("tab[%d][%d]= ", j + 1, i + 1);
fflush(stdout); // add
scanf(...
答案 1 :(得分:0)
你应该首先这样分配:
m = (int**)malloc(dimc*sizeof(int*));
之后你会这样分配:
m[i] = (int *)malloc(sizeof(int));