使用malloc获取模拟阵列的大小

使用malloc获取模拟阵列的大小,c,arrays,pointers,malloc,dynamic-memory-allocation,C,Arrays,Pointers,Malloc,Dynamic Memory Allocation,我有一个使用malloc指针的模拟2D数组,我想得到该数组的大小,因为sizeof()返回指针的大小。 我的代码(ANSI C): 提前谢谢!(有关更多信息,我使用GNU/Linux)首先,为2D阵列分配内存的方式是错误的。您需要将其更改为: void main(){ int s1 = 10; int s2 = 15; int** rack = malloc(s1*sizeof(int*)); if (rack == NULL) return;

我有一个使用malloc指针的模拟2D数组,我想得到该数组的大小,因为sizeof()返回指针的大小。 我的代码(ANSI C):


提前谢谢!(有关更多信息,我使用GNU/Linux)

首先,为2D阵列分配内存的方式是错误的。您需要将其更改为:

void main(){
    int s1 = 10;
    int s2 = 15;
    int** rack = malloc(s1*sizeof(int*));
    if (rack == NULL)
        return;
    for(int i=0; i<s1; i++) {
        rack[i]=malloc(s2*sizeof(int));
        if (rack[i] == NULL)
            return;
    }

    ... 

    free(rack);
    return;
}
void main(){
int s1=10;
int s2=15;
int**rack=malloc(s1*sizeof(int*);
如果(机架==NULL)
返回;

对于(int i=0;i首先,您为2D数组分配内存的方式是错误的。您需要将其更改为:

void main(){
    int s1 = 10;
    int s2 = 15;
    int** rack = malloc(s1*sizeof(int*));
    if (rack == NULL)
        return;
    for(int i=0; i<s1; i++) {
        rack[i]=malloc(s2*sizeof(int));
        if (rack[i] == NULL)
            return;
    }

    ... 

    free(rack);
    return;
}
void main(){
int s1=10;
int s2=15;
int**rack=malloc(s1*sizeof(int*);
如果(机架==NULL)
返回;

对于(int i=0;我注意到了这一点。另外,ANSI C指的是旧的、过时的C版本;若您在Linux上,很有可能升级到C11。一个好习惯是不要在
malloc
中使用类型,而是使用指针应该指向
malloc(s1*sizeof*rack)的对象来执行
sizeof
。同样,在C语言中,你不应该强制执行
malloc
和friends的返回。如果给你一个指针,而该指针是用
malloc
返回的值分配/初始化的,那么你在malloc中分配的空间量是错误的,没有(可移植的)找出最初请求了多少内存的方法。这些链接可能很有趣:或者我不想说你不能,但在C中,你分配内存,并负责跟踪分配。没有一个简单的库函数可以告诉你在你的早期为变量
X
分配了多少内存代码。(对于多个函数和作用域,这些信息在运行时可能不可用)请注意。另外,ANSI C指的是旧的、过时的C版本;若您在Linux上,很可能会升级到C11。一个好习惯是不要在
malloc
中使用
sizeof
类型,而是使用指针应该指向
malloc的对象(s1*sizeof*rack)
。同样,在C语言中,你不应该强制执行
malloc
和friends的返回。如果给你一个指针,而该指针是用
malloc
返回的值分配/初始化的,那么你在malloc中分配的空间量是错误的,没有(可移植的)找出最初请求了多少内存的方法。这些链接可能很有趣:或者我不想说你不能,但在C中,你分配内存,并负责跟踪分配。没有一个简单的库函数可以告诉你在你的早期为变量
X
分配了多少内存代码。(对于多个函数和作用域,这些信息在运行时可能不可用)请注意,您没有释放所有已分配的内存。@Bob_uuuu我没有释放,因为我只回答了分配的一部分。我假设OP释放了他的内存,但向我们显示了最小部分。由于
int
size\u t
的范围不同,
s1*s2*sizeof(int)
sizeof(int)时可能溢出*s1*s2*
没有。IAC,对于数组索引和大小使用
size\t
int
更好。请注意,您没有释放所有已分配的内存。@Bob\uuuuuuu。我没有,因为我只回答了分配的一部分。我假设OP释放了他的内存,但显示了最小的部分。由于差异在
int
size\u t
的范围内,
s1*s2*sizeof(int)
可能会溢出,而
sizeof(int)*s1*s2*
不会溢出。IAC对于数组索引和大小,最好使用
size\u t
,而不是
int
void main(){
    int s1 = 10;
    int s2 = 15;
    int** rack = malloc(s1*sizeof(int*));
    if (rack == NULL)
        return;
    for(int i=0; i<s1; i++) {
        rack[i]=malloc(s2*sizeof(int));
        if (rack[i] == NULL)
            return;
    }

    ... 

    free(rack);
    return;
}