gpt4 book ai didi

c - 分配一个连续的内存块

转载 作者:太空宇宙 更新时间:2023-11-04 01:01:25 24 4
gpt4 key购买 nike

我尝试使用连续的内存块,而且我尝试创建一个在编译时(C99 之前)维度未知的数组,因此没有可变长度数组 涉及到这里。

我带来了以下内容:

#include <stdio.h>
#include <stdlib.h>

int main(void){
unsigned int row, col,i, j, k;
int l = 0;

printf("Give the ROW: ");
if ( scanf("%u",&row) != 1){
printf("Error, scanf ROW\n");
exit(1);
}

printf("Give the COL: ");
if ( scanf("%u",&col) != 1){
printf("Error, scanf COL\n");
exit(2);
}

int *arr = malloc(sizeof *arr * row * col); /* This doesn't compile with `-pedantic` */
if(arr == NULL){
printf("Error, malloc\n");
exit(3);
}

for ( i = 0; i < row ; i++){
for ( j = 0 ; j < col ; j++){
arr[i * col + j] = l;
l++;
}
}

for (k = 0 ; k < (row * col) ; k++){
printf("%d ",arr[k]);
}

free(arr);
}

这给了我以下内容:

Give the ROW: 5
Give the COL: 5
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

现在我有一个问题:

Is this the right approach?

最佳答案

你在这一行中有一个隐藏的错误:

arr[i * row + j] = k;

正确的指数计算是

arr[i * col + j] = k;

您没有注意到该问题的原因是 rowcol 在代码中具有相同的值。例如,如果将 row 设置为 6,将 col 设置为 3,则错误将很明显。您将为 18 个整数分配空间,但是当 i 为 5 且 j 为 2 时,代码将尝试访问位置 [5*6 + 2] 超出数组的末尾,将导致未定义的行为。

地址计算的工作原理如下。下图显示了二维数组(行=6 和列=3)在内存中的实际布局。请注意,每行中的项目数等于数组中的列数。所以每行的起始索引是列数的倍数。在这个例子中,由于列数是 3,行从索引 0,3,6,9,...数组,一维数组中的索引是i*col + j

enter image description here

关于c - 分配一个连续的内存块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37419127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com