我真的需要分配 arr 吗?
您需要将arr 设置为指向您拥有的内存块,方法是调用malloc 或将其设置为指向另一个数组。否则,它指向一个随机内存地址,您可能访问也可能无法访问。
在 C 中,不鼓励转换 malloc 的结果1;这是不必要的,在某些情况下,如果您忘记包含 stdlib.h 或在范围内没有 malloc 的原型,则可能会掩盖错误。
我通常建议 malloc 调用写成
T *ptr = malloc(N * sizeof *ptr);
其中T 是您使用的任何类型,N 是您要分配的该类型元素的数量。 sizeof *ptr 等价于 sizeof (T),因此如果您更改了 T,则无需在 malloc 调用本身中复制该更改。只是少了一个维护头痛。
即使不使用 malloc,它也会给我结果
因为你没有在声明中显式初始化,所以arr的初始值为indeterminate2;它包含一个随机位串,该位串可能对应也可能不对应于有效的可写地址。尝试通过无效指针读取或写入的行为是undefined,这意味着编译器没有义务警告您您正在做一些危险的事情。未定义行为的一个可能结果是您的代码似乎按预期工作。在这种情况下,您似乎正在访问一个随机的内存段,该段恰好是可写的并且不包含任何重要的内容。
我的第二个疑问是'我期待第 9 行出现错误,因为我认为它必须是 printf("%s",*arr);什么的。
%s 转换说明符告诉printf 对应的参数是char * 类型,所以printf("%s", arr); 是正确的。如果您使用了%c 转换说明符,那么是的,您需要使用* 运算符或下标取消引用arr,例如printf("%c", *arr); 或printf("%c", arr[i]);。
此外,除非您的编译器文档明确将其列为有效签名,否则您应该不将main 定义为void main();请改用int main(void) 或int main(int argc, char **argv)。
1。 C++ 中需要强制转换,因为 C++ 不允许您在没有显式强制转换的情况下将
void * 值分配给其他指针类型
2。这适用于在块范围内声明的指针。在文件范围(在任何函数之外)或使用 static 关键字声明的指针被隐式初始化为 NULL。