【发布时间】:2021-06-18 02:58:18
【问题描述】:
我是 C 编程的初学者。最近有人教我如何使用malloc,但我认为我不太了解它。就像事实上为什么它需要void * 或任何类型转换?为什么语法本身在void *malloc(size_t size) 中有(void *)。以及分配给malloc 函数的变量如何知道内存块从哪里开始? malloc 函数在分配内存块后是否返回地址或其他内容?
在课堂上,我们的教授给了我们这个程序。我也了解 2d 内存分配的工作原理。
#include<stdio.h>
#include<conio.h>
void main(void)
{
int *studentInfo=NULL,i=1,j=10,k=0,l=0;
//int *studInfo[10];
int memLoc=0;
clrscr();
printf("How many Student Information You want to store:");
scanf("%d",&j);
printf("How many Subject Marks per student You want to store:");
scanf("%d",&k);
studentInfo=(int *)malloc(j*k*sizeof(int));
//memLoc=0;
for(l=0;l<j;l++)
{
printf("Enter Marks for %dth Student",l+1);
for(i=0;i<k;i++)
{
printf("\nEnter Marks for Subject %d:",i+1);
scanf("%d",studentInfo+(l*j)+i);
}
}
//3 students and 3 subjects
//memory allocated=3*3*2=18
//0,1,2 student 0*no of students
//3 4 5 student 1
//6 7 8 student 2
printf("\nInformation you Entered\n");
for(l=0;l<j;l++)
{
printf("Makrs of Student %d:",l+1);
for(i=0;i<k;i++)
printf("\t%d",*(studentInfo+(l*j)+i));
printf("\n");
}
//*(studentInfo)=10;
//*(studentInfo+1)=20;
//*(studentInfo+2)=30;
//printf("%d\n",sizeof(studentInfo));
//printf("%d\n",*(studentInfo));
//printf("%d\n",*(studentInfo+i++));
//printf("%d\n",*(studentInfo+i++));
free(studentInfo);
getch();
}
在此我们将 studentInfo 指针分配给 malloc 函数,对吗?那么...studentInfo 怎么知道内存块的地址是美国而不是南极洲?而且我知道用其他数据类型对 malloc 进行类型转换不是一个好习惯。但是为什么(int *)。为什么 malloc 需要一个指针?如果 malloc 需要一个指针,这意味着它正在返回一个地址,对吗?我向我的朋友问过这个问题,他说没有 malloc 不会返回任何东西。还有一件事是我们需要将类型转换放在括号中吗?
请用非常简单的术语解释。 谢谢。
【问题讨论】:
-
我实际上认为强制转换是多余且不必要的,除非您出于某种原因必须在 C++ 中使用
malloc。 stackoverflow.com/questions/605845/… -
studentInfo怎么知道内存块的地址是美国而不是南极洲。不知道你的意思是什么。
malloc返回分配内存的地址。它没有在里面放任何东西。您是将数据写入内存块的人,因此您应该知道每个块将包含什么。 -
如果 malloc 需要一个指针,这意味着它正在返回一个地址,对吗?。没有必要和任何人争论。只需阅读man page。它准确地告诉你返回了什么:malloc() 和 calloc() 函数返回一个指向分配内存的指针
-
“为什么 malloc 需要一个指针??如果 malloc 需要一个指针,这意味着它正在返回一个地址对吗?” 是的,它返回一个地址。如果没有将地址放入指针中,分配的内存将会丢失,并且会发生内存泄漏。
-
@kaylum 这就是我的说法,内存块的地址不是A而是B。
标签: c pointers multidimensional-array malloc dynamic-memory-allocation