熟悉指针,我遇到了使用malloc()和free()进行动态内存分配的部分。我希望对我对该主题的理解得到确认或纠正。
直到现在,我仍然知道指针的双重好处是双重的:
关于malloc(),我有种感觉,如果不重置指针地址,指针算法会变得非常危险。在下面的示例中,我使用malloc()创建了两个指针ptr和ptr1。我知道这两个malloc()函数分配了两个内存块,每个内存块的大小与size * sizeof(int)一样大,因此这是保留的内存,并且将这两个块的第一个元素的地址提供给ptr和ptr1。
使用第一个for循环,我正在使用指针将值分配到内存位置。 ptr使用指针算术,ptr1使用数组算术(如果我可以这样称呼的话)。
在for循环结束时,ptr不指向保留的存储块的第一个元素的地址,必须将其复位以指向第一个元素的地址。
第二个for循环在两个内存块中打印数据stort。在那里,我不会将ptr重置为指向内存中第一个元素的地址。
现在是个大问题:使用free(ptr),free()会收到一个指向某个地址(而不是保留的内存块的起始地址)的指针。我是否正确理解写free(ptr),现在将释放一个大小为* sizeof(int)的内存块,并且可能释放了一些不应释放的敏感数据?
正确理解吗?如果是这样,在与malloc()结合使用指针时,建议始终使用数组算术吗?
谢谢,亚历克斯
#include <stdio.h>
#include <stdlib.h>
int main()
{
int size = 0;
printf("Enter the array size: ");
scanf("%d",&size);
int * ptr = (int *)malloc(size*sizeof(int));
int * ptr1 = (int *)malloc(size*sizeof(int));
int i = 0;
// First for loop
for( ; i<size;i++)
{
*ptr = i;
++ptr;
*(&ptr1[i]) = i;
}
ptr = ptr-size; // Resetting to the start address
// Second for loop
for(i = 0; i<size;i++)
{
printf("%d\t\t",*ptr);
ptr++;
printf("%d\n",*(&ptr1[i]));
}
free(ptr); // Is the correct memory block now freed?
free(ptr1);
return 0;
}
熟悉指针,我遇到了使用malloc()和free()进行动态内存分配的部分。我想对我的理解有一个确认或更正...
您的程序有未定义的行为。传递给free()
的指针值必须完全相等
对于初学者,这些语句中使用了多余的运算符
谢谢大家-您基本上确认了我的想法。我会牢记您的建议:)