使用malloc获取模拟阵列的大小
我有一个使用malloc指针的模拟2D数组,我想得到该数组的大小,因为sizeof()返回指针的大小。 我的代码(ANSI C):使用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;
提前谢谢!(有关更多信息,我使用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;
}