当我努力运行这个程序时,我遇到了一个执行问题,它只是动态地分配一个带有所选值的多维数组,只是将它归零。它编译正确,但它不会执行。
#include<stdio.h>
#include<stdlib.h>
int main(void) {
int **tab;
int ligne;
int col;
printf("saisir le nbre de lignes volous\n");
scanf("%d", &ligne);
printf("saisir le nbre de colonnes volous\n");
scanf("%d", &col);
tab = (int**)malloc(ligne*sizeof(int*));
int i ,j;
for (i=0 ; i < ligne; i++) {
*(tab+i) = (int*)malloc(col*sizeof(int));
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
**(tab + i+ j) = 0;
}
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
printf("%d\t", **(tab + i +j));
}
printf("\n");
}
free(tab);
return 0;
}
谢谢。
答案 0 :(得分:1)
使用简单的[row][col]
访问双指针。它更具可读性,您可以在编码时避免错误。
#include<stdio.h>
#include<stdlib.h>
int main(void) {
int **tab;
int ligne;
int col;
printf("saisir le nbre de lignes volous\n");
scanf("%d", &ligne);
printf("saisir le nbre de colonnes volous\n");
scanf("%d", &col);
tab = malloc(ligne*sizeof(int*));
if (tab != NULL)
{
int i ,j;
for (i=0 ; i < ligne; i++)
{
tab[i] = malloc(col*sizeof(int));
if (tab[i] == NULL)
{
fprintf(stderr, "Malloc failed\n");
return 1;
}
}
int k=0;
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
tab[i][j] = k++;
}
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
printf("%d\t", tab[i][j]);
}
free(tab[i]);
printf("\n");
}
}
free(tab);
return 0;
}
答案 1 :(得分:0)
int main(void) {
int ligne;
int col;
printf("saisir le nbre de lignes volous\n");
scanf("%d", &ligne);
printf("saisir le nbre de colonnes volous\n");
scanf("%d", &col);
int tableSize = ligne * (col*sizeof(int));
int * table = (int*) malloc(tableSize);
int i,j;
for (i=0 ; i < ligne; i++) {
for (j = 0; j < col; j++) {
*(table + i+ j) = 0;
}
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
printf("%d\t", *(table + i +j));
}
printf("\n");
}
free(table);
return 0;
}
答案 2 :(得分:0)
在这里,我做了一些更改并在更改中添加了一些注释
#include<stdio.h>
#include<stdlib.h>
int main(void) {
int **tab = NULL;
int ligne = 0;
int col = 0;
char buffer[128] = {0};
printf("saisir le nbre de lignes volous\n");
// to avoid leaving \n in buffer after you enter the first value
// you should also check also return value of fgets
// and quit program if it returns NULL
// in general it is good practice to check return values
// of all run-time functions.
if (fgets(buffer,sizeof(buffer),stdin)==NULL) {
return 1;
}
ligne = atoi(buffer);
printf("saisir le nbre de colonnes volous\n");
if (fgets(buffer,sizeof(buffer),stdin) == NULL) {
return 1;
}
col = atoi(buffer);
tab = malloc(ligne*sizeof(int*)); // do not cast malloc
int i ,j;
// use tab[i] and tab[i][j] syntax, it is easier to read
for (i=0 ; i < ligne; i++) {
tab[i] = malloc(col*sizeof(int));
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
tab[i][j] = 0;
}
}
for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
printf("%d\t", tab[i][j]);
}
printf("\n");
}
// before you free tab, you need to free all lines
for (i=0 ; i < ligne; i++) {
free(tab[i]);
}
free(tab);
return 0;
}
答案 3 :(得分:0)
由于您已经分配了数组(一维部分),因此您的数组可以作为for (i = 0; i < ligne; i++) {
for (j = 0; j < col; j++) {
**(tab + i+ j) = 0; /* <--- this is an error */
}
}
进行处理,而不会像在
tab + i + j
如您所见i
是指向ligne
(j
号码)加col
(tab[i][j]
号码)的指针,且两者都不是#39; t实际上是相同的大小(列是一个单元格大小,行是一行大小)你最好写tab[i]
,因为malloc(3)
是一个指针(用{{1}分配})指向一个单维数组(并且不同的指针tab[0]
,tab[1]
,... tab[n]
不必在它们之间相互关联,因为它们来自不同的malloc()
来电)如果你不喜欢括号表示法,那么你应该写出等价的
*(*(mat + i) + j) /* equivalent to mat[i][j] */
并且从不在您的代码中使用的符号。
**(tab + i + j) /* equivalent to *mat[i + j] */