在我最近回来的一个测试中,它有一个问题,大意是“假设这段代码可以编译,它会做什么?”
代码:
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/