c - 为 int* 动态分配 100 个字节,然后尝试使用指针算法为其设置值有什么影响?

标签 c pointers malloc pointer-arithmetic

在我最近回来的一个测试中,它有一个问题,大意是“假设这段代码可以编译,它会做什么?”

代码:

int *ptr

ptr = (int *) malloc( 25 * sizeof(int)); //100 bytes

*ptr = 'x';
*(ptr + 1) = 'x';
.... //go through all the values from 1 to 99 as well
*(ptr +99) = 'x';

我已经编写了代码并运行了它,当使用 printf(%d, *x) 打印时,结果是 120,即 x 的 ascii 值。我知道 int 必须只是被设置为 x,当它被打印为 int 时,ascii 值被打印出来,但是当谈到 malloc 的实际效果是什么,以及所有 *(ptr + i) 实际上是这样。

最佳答案

在 C 语言中,数组和指针非常相似,为了简单起见,在这种情况下将它们视为相同是很方便的。因此,您可以将 malloc 视为动态分配 25 个整数的数组(例如,与动态地说 int ptr[25] 相同),或者您可以认为它阻塞了内存中 25 个连续的整数地址并将它们标记为有效。这样,ptr == &ptr[0]。取消引用运算符 * 的意思是“更改存储在此地址的值”,它实质上是“撤消” & 运算符。所以,*ptr == *(&ptr[0]) == ptr[0]。此命令只是将 ptr[0] 设置为等于“x”,其 ASCII 值为 120(并将打印为 ASCII 值,因为数组的类型为“int”而非“char”类型)。其余的作业也这样做。根据您的编译器和操作系统,超过 ptr + 24 的任何内容都可能会给您带来段错误或无效写入,因为您只分配了 25 个整数,因此 (ptr+99) 不应该是可写地址。如果您只分配了 25 个插槽,则您应该无法编辑 ptr[99]

关于c - 为 int* 动态分配 100 个字节,然后尝试使用指针算法为其设置值有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41124063/

相关文章:

C - 双向链表

c - C预处理器的工作

c - 错误: incompatible types when initializing type

c - 用 C 编写着色器错误检查器

c - 为什么 C 有这么多不同的类型?

c - 互斥锁不工作

c - 如何使用 C 中的指针将一个数组的内容复制到另一个数组?

C改变一个void指针代表的值

c - 以基本方式使用线程的段错误

c - 在不同函数中分配的 Realloc 指针