C:指针算术和malloc()-否?

问题描述 投票:0回答:3

熟悉指针,我遇到了使用malloc()和free()进行动态内存分配的部分。我希望对我对该主题的理解得到确认或纠正。

直到现在,我仍然知道指针的双重好处是双重的:

  1. 通过引用调用(即,可以使用指针访问和更改函数外部的变量,而无需全局变量)。>>
  2. 使用指针算法,这是遍历数组(例如,字符串的char数组),访问和操作数据的非常方便且代码有效的方式。
  3. 关于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()进行动态内存分配的部分。我想对我的理解有一个确认或更正...

c arrays pointers malloc free
3个回答
2
投票

您的程序有未定义的行为。传递给free()的指针值必须完全相等


0
投票

对于初学者,这些语句中使用了多余的运算符


0
投票

谢谢大家-您基本上确认了我的想法。我会牢记您的建议:)

© www.soinside.com 2019 - 2024. All rights reserved.