当前位置: 首页 > 知识库问答 >
问题:

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

郎献
2023-03-14
    null

这是正确的理解吗?如果是这样,那么在使用指针与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;
}

共有1个答案

叶富
2023-03-14

您的程序有未定义的行为。传递给free()的指针值必须完全等于从malloc()calloc()realloc()获得的值。来自cppreference.com:

如果ptr的值不等于前面由malloc()、calloc()、realloc()或aligned_alloc()返回的值(从C11开始),则该行为是未定义的。

因此,保留一个指向分配的纯指针,以传递给free(),并使用指针算法的副本。

 类似资料:
  • C++ 指针 指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。 假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算: ptr++ 在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在

  • C++ 运算符 C++ 提供了两种指针运算符,一种是取地址运算符 &,一种是间接寻址运算符 *。 指针是一个包含了另一个变量地址的变量,您可以把一个包含了另一个变量地址的变量说成是"指向"另一个变量。变量可以是任意的数据类型,包括对象、结构或者指针。 取地址运算符 & & 是一元运算符,返回操作数的内存地址。例如,如果 var 是一个整型变量,则 &var 是它的地址。该运算符与其他一元运算符具有

  • 正如在主要章节中所解释的,Pascal指针是一个地址,它是存储在单词中的数值。 因此,您可以像对数值一样对指针执行算术运算。 有四个算术运算符可用于指针:递增,递减,+和 - 。 为了理解指针运算,让我们考虑ptr是一个整数指针,它指向地址1000.假设32位整数,让我们对指针执行递增操作 - Inc(ptr); 现在,在上述操作之后, ptr将指向位置1004,因为每次ptr递增时,它将指向下

  • 如你所知,指针是一个数值的地址; 因此,您可以像对数值一样对指针执行算术运算。 可以在指针上使用四个算术运算符:++, - ,+和 - 要理解指针运算,让我们考虑ptr是一个指向地址1000的整数指针。假设32位整数,让我们对指针执行以下算术运算 - ptr++ ptr将指向位置1004,因为每次ptr递增时,它将指向下一个整数。 此操作将指针移动到下一个存储器位置,而不会影响存储器位置的实际值

  • c中的指针是地址,它是一个数值。 因此,您可以像对数值一样对指针执行算术运算。 可以在指针上使用四个算术运算符:++, - ,+和 - 要理解指针运算,让我们考虑ptr是一个指向地址1000的整数指针。假设32位整数,让我们对指针执行以下算术运算 - ptr++ 在上述操作之后, ptr将指向位置1004,因为每次ptr递增时,它将指向下一个整数位置,该位置是当前位置旁边的4个字节。 此操作将指

  • 问题内容: 我的应用程序使用某种复杂的不可变数据结构,该结构以二进制文件编码。我需要在字节级别访问它,避免任何复制。通常,我将使用C或C ++指针算术和类型转换来访问和解释原始字节值。我想对Swift做同样的事情。 我发现以下作品: 但是,我不确定它的效率如何。每次我调用对象时都要做和分配对象,或者它们只是用于处理指针的语法糖吗? 在Swift中有更好的方法吗? 编辑: 我创建了一个小的Objec