gpt4 book ai didi

c - 将 1 个字符的空间分配给 int 指针

转载 作者:行者123 更新时间:2023-12-04 11:58:25 25 4
gpt4 key购买 nike

我正在学习 C 并且对为什么使用以下代码段没有从 GCC 收到任何警告/错误感到有些困惑。我正在为指向 int 的指针分配 1 个字符的空间,这是 GCC 完成的一些更改(例如静默优化为 int 分配的空间)?

#include <stdlib.h>
#include <stdio.h>

typedef int *int_ptr;

int main()
{
int_ptr ip;
ip = calloc(1, sizeof(char));
*ip = 1000;
printf("%d", *ip);
free(ip);
return 0;
}
更新
阅读下面的答案后,如果我反过来做,是否仍然不安全和有风险,例如将int的空间分配给指向char的指针?我困惑的根源是 Rosetta Code 中的以下答案, 在函数中 StringArray StringArray_new(size_t size)编码器似乎正是这样做的 this->elements = calloc(size, sizeof(int));哪里 this->elementschar** elements .

最佳答案

calloc 的结果是类型 void*隐式转换为 int*类型。 C 编程语言和 GCC 只是相信程序员会编写合理的强制转换,因此不会产生任何警告。您的代码在技术上是有效的 C,即使它在运行时产生无效的内存写入。所以不,GCC 不会为整数隐式分配空间。
如果您想在运行(或编译)之前查看此类警告,您可能需要使用例如 Clang Static Analyzer。
如果您想在运行时看到此类错误,请使用 Valgrind 运行您的程序。
更新
为 1 分配空间 int (即通常为 4 个字节)然后将其解释为 char (1 char 是 1 个字节)不会导致任何内存错误,因为 int 所需的空间大于 char 所需的空间.实际上,您可以将结果用作 4 char 的数组。的。sizeof运算符返回该类型的大小作为字节数。 calloc函数然后分配那个字节数,它不知道什么类型将存储在分配的段中。
虽然这不会产生任何错误,但它确实可以被视为一种“有风险且不安全”的编程实践。异常(exception)情况存在于高级应用程序中,您希望重用相同的内存段来存储不同类型的值。
您链接到的 Rosetta Code 上的代码恰好在该行中包含一个错误。它应该为 char* 分配内存而不是 int .这些通常不相等。在我的机器上,一个 int 的大小是 4 个字节,而一个 char* 的大小是 8 个字节。

关于c - 将 1 个字符的空间分配给 int 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68753532/

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