Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不确定我关于malloc(c)的输出 当理解输出时,我应该考虑什么?因为现在我的输出是20个整数的垃圾,我不知道为什么。我的目标是创建20个数组,每个数组中包含30个整数。所以最后一个数组将有19到48的整数 #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int **p;//Declaration of a pointer variable int i = 0, j; int rows = 20; int columns = 30; p = (int**)malloc(20 * sizeof(int)); //First "bookend" allocates space printf("Hello World! I have created a dynamic 20-array of 20x30 integers!\n"); if (p == NULL) { printf("Failed to allocated memory!"); exit(1); } for (i = 0; i < 20; i++) { if (p[i] == NULL) { printf("Integers not allocated! "); } p[i] = (int**)malloc(20 * sizeof(int)); } for (i = 0; i < 20; i++) { for (j = 0; j < 20; j++) { if (p[j] == NULL) { printf("Integers not allocated! "); } p[i][j] = (int *)malloc(40 * sizeof(int)); } printf("%d\n", p[(i+1)+j]); } free(p); return 0; } #包括 #包括 int main(int argc,char*argv[]) { int**p;//指针变量的声明 int i=0,j; int行=20; int列=30; p=(int**)malloc(20*sizeof(int));//第一个“bookend”分配空间 printf(“你好,世界!我创建了一个由20x30个整数组成的动态20数组!\n”); if(p==NULL) { printf(“分配内存失败!”); 出口(1); } 对于(i=0;i_C_Arrays_Malloc - Fatal编程技术网

不确定我关于malloc(c)的输出 当理解输出时,我应该考虑什么?因为现在我的输出是20个整数的垃圾,我不知道为什么。我的目标是创建20个数组,每个数组中包含30个整数。所以最后一个数组将有19到48的整数 #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int **p;//Declaration of a pointer variable int i = 0, j; int rows = 20; int columns = 30; p = (int**)malloc(20 * sizeof(int)); //First "bookend" allocates space printf("Hello World! I have created a dynamic 20-array of 20x30 integers!\n"); if (p == NULL) { printf("Failed to allocated memory!"); exit(1); } for (i = 0; i < 20; i++) { if (p[i] == NULL) { printf("Integers not allocated! "); } p[i] = (int**)malloc(20 * sizeof(int)); } for (i = 0; i < 20; i++) { for (j = 0; j < 20; j++) { if (p[j] == NULL) { printf("Integers not allocated! "); } p[i][j] = (int *)malloc(40 * sizeof(int)); } printf("%d\n", p[(i+1)+j]); } free(p); return 0; } #包括 #包括 int main(int argc,char*argv[]) { int**p;//指针变量的声明 int i=0,j; int行=20; int列=30; p=(int**)malloc(20*sizeof(int));//第一个“bookend”分配空间 printf(“你好,世界!我创建了一个由20x30个整数组成的动态20数组!\n”); if(p==NULL) { printf(“分配内存失败!”); 出口(1); } 对于(i=0;i

不确定我关于malloc(c)的输出 当理解输出时,我应该考虑什么?因为现在我的输出是20个整数的垃圾,我不知道为什么。我的目标是创建20个数组,每个数组中包含30个整数。所以最后一个数组将有19到48的整数 #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int **p;//Declaration of a pointer variable int i = 0, j; int rows = 20; int columns = 30; p = (int**)malloc(20 * sizeof(int)); //First "bookend" allocates space printf("Hello World! I have created a dynamic 20-array of 20x30 integers!\n"); if (p == NULL) { printf("Failed to allocated memory!"); exit(1); } for (i = 0; i < 20; i++) { if (p[i] == NULL) { printf("Integers not allocated! "); } p[i] = (int**)malloc(20 * sizeof(int)); } for (i = 0; i < 20; i++) { for (j = 0; j < 20; j++) { if (p[j] == NULL) { printf("Integers not allocated! "); } p[i][j] = (int *)malloc(40 * sizeof(int)); } printf("%d\n", p[(i+1)+j]); } free(p); return 0; } #包括 #包括 int main(int argc,char*argv[]) { int**p;//指针变量的声明 int i=0,j; int行=20; int列=30; p=(int**)malloc(20*sizeof(int));//第一个“bookend”分配空间 printf(“你好,世界!我创建了一个由20x30个整数组成的动态20数组!\n”); if(p==NULL) { printf(“分配内存失败!”); 出口(1); } 对于(i=0;i,c,arrays,malloc,C,Arrays,Malloc,我希望我没有弄错你的问题 你得到的不完全是garbase。。。当执行p[i][j]=(int*)malloc(40*sizeof(int))您只需再分配一个包含40个元素的数组,并将其地址放入p[i][j]。。。因此,当您尝试打印p[(i+1)+j]时,您正在打印您要打印的40个元素数组的地址。您的代码有几个问题: 对于初始分配,每个元素都是int*,因此需要20*sizeof(int*),而不是20*sizeof(int) malloc分配的任何空间都是未初始化的,因此尝试读取它是未定义的行

我希望我没有弄错你的问题


你得到的不完全是garbase。。。当执行
p[i][j]=(int*)malloc(40*sizeof(int))
您只需再分配一个包含40个元素的数组,并将其地址放入
p[i][j]
。。。因此,当您尝试打印
p[(i+1)+j]
时,您正在打印您要打印的40个元素数组的地址。

您的代码有几个问题:

  • 对于初始分配,每个元素都是
    int*
    ,因此需要
    20*sizeof(int*)
    ,而不是
    20*sizeof(int)
  • malloc
    分配的任何空间都是未初始化的,因此尝试读取它是未定义的行为。另一方面,如果使用
    calloc
    ,则会将分配的内存初始化为所有0
  • 您将经历一组额外的循环,试图为每个
    int
    位置分配另一个数组。如果您试图创建一个3D数组(并将
    p
    定义为
    int***
    ),该数组可以工作,但不适用于2D数组
  • 不要强制转换malloc的返回值,因为这会掩盖细微的bug
如果要动态分配一个20 X 30的
int
数组,可以这样做:

// first allocate 20 int*
int **p = malloc(20 * sizeof(int *));
if (p == NULL) {
    perror("malloc failed");
    exit(1);
}

int i;
for (i=0;i<30;i++) {
    // for each row, allocate 30 int
    p[i] = malloc(30 * sizeof(int));
    if (p[i] == NULL) {
        perror("malloc failed");
        exit(1);
    }
}
//首先分配20 int*
int**p=malloc(20*sizeof(int*);
if(p==NULL){
perror(“malloc失败”);
出口(1);
}
int i;

对于(i=0;iNote:
20!=30
…和
20!=40
谢谢。我仍在打印地址。(我删除了额外的for循环)