gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:18:06 24 4
gpt4 key购买 nike

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

代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com