这是我的学校项目,我只制作骨架,但编译器说
[警告]从不兼容的指针类型
分配
我改变了一些指针,但它无法正常工作。任何人都可以帮助我吗?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int *col_num, *row_num, **matrix;
double k, l;
int i, j;
printf("Enter your column number:\n");
scanf("%d", &col_num);
printf("Enter your row number:\n");
scanf("%d", &row_num);
matrix[*col_num] = (int **) malloc(*col_num * sizeof(int));
if (matrix[*col_num] == NULL)
printf("No free Memory!");
matrix[*row_num] = (int **) malloc(*row_num * sizeof(int));
if (matrix[*row_num] == NULL)
printf("No free Memory!");
for (i = 0; i < *col_num; i++)
for (j = 0; j < *row_num; j++)
{
printf("Please Enter %d%d matrix:", i + 1, j + 1);
scanf("%lf", &matrix[i][j]);
}
for (i = 0; i < *col_num; i++)
{
for (j = 0; j < *row_num; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
free(matrix);
return 0;
}
答案 0 :(得分:1)
首先,在这一部分:
int *col_num, *row_num, **matrix;
printf("Enter your column number:\n");
scanf("%d", &col_num);
printf("Enter your row number:\n");
scanf("%d", &row_num);
col_num
和row_num
不应该是指针,你可以这样做:
int col_num, row_num, **matrix;
printf("Enter your column number:\n");
scanf("%d", &col_num);
printf("Enter your row number:\n");
scanf("%d", &row_num);
此外,检查scanf()
的返回值也不是一个坏主意,以防万一用户输入垃圾。
您似乎也在程序中编写matrix[*row_num] = .........
之类的内容,这是不必要的。您不应该在任何地方引用*row_num
和*col_num
。相反,只需自己调用row_num
和col_num
,这应该没问题。
如果您想使用最初难以使用的**matrix
,则需要谨慎使用malloc
来完成此操作。另请参阅Should I cast the return value of malloc。
首先开始:
为行分配内存:
int **matrix = malloc(row_num * sizeof(*matrix)); /* check return value */
然后对于每一行,malloc()
列的一些内存:
for (i = 0; i < row_num; i++) {
matrix[i] = malloc(col_num * sizeof(*matrix[i])); /* check return value */
然后free
最后的指针:
free(matrix[i]);
free(matrix);
使用这些想法后,您的代码看起来应该是这样的(除非我误解了您的代码的目的):
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[]) {
int row_num, col_num, **matrix;
int i, j;
printf("Enter your column number: ");
if (scanf("%d", &col_num) != 1) {
printf("Invalid input\n");
exit(EXIT_FAILURE);
}
printf("Enter your row number: ");
if (scanf("%d", &row_num) != 1) {
printf("Invalid input\n");
exit(EXIT_FAILURE);
}
matrix = malloc(row_num * sizeof(*matrix)); /* Or sizeof(int *) */
if (!matrix) {
printf("Cannot allocate memory for pointer.\n");
exit(EXIT_FAILURE);
}
for (i = 0; i < row_num; i++) {
matrix[i] = malloc(col_num * sizeof(*matrix[i])); /* Or sizeof(int) */
if (!matrix[i]) {
printf("Cannot allocate memory for pointer.\n");
exit(EXIT_FAILURE);
}
for (j = 0; j < col_num; j++) {
printf("Please Enter %d%d matrix: ",i+1,j+1);
if (scanf("%d", &matrix[i][j]) != 1) {
printf("Invalid input\n");
exit(EXIT_FAILURE);
}
}
}
printf("Your 2D array:\n");
for (i = 0; i < row_num; i++) {
for (j = 0; j < col_num; j++) {
printf("%d ", matrix[i][j]);
}
free(matrix[i]);
matrix[i] = NULL;
printf("\n");
}
free(matrix);
matrix = NULL;
return 0;
}