【发布时间】:2020-05-30 16:23:13
【问题描述】:
我试图弄清楚如何将一个简单的char 添加到使用malloc 创建的数组中。
#include <stdio.h>
#include <stdlib.h>
int main() {
char *array = malloc(2);
array[0] = "h";
printf("%s", array);
return 0;
}
它给出警告:
warning: assignment makes integer from pointer without a cast [-Wint-conversion]
array[0] = "h";
如果我仍然运行程序,它只会打印出 3 个随机符号。
【问题讨论】:
-
array[0]='h'; array[1]='\0'或strcpy(array, "h"); -
很遗憾编译器没有拒绝这个错误的伪代码。
gcc -Wall -W -Werror是你的朋友。 -
array不是一个数组,它是一个指向数组的指针。malloc()不创建数组,它分配一个。您不是向数组添加字符,而是要分配或设置数组的char元素。 -
memcpy(array, "h", 2)而不是array[0] = "h";会起作用(2 是长度,您将在其中复制两个字节以包含尾随的 '\0' 字符(字节))。数组指针的名称,与您分配的两个字节内存的地址相同。如果您完成了char array[2];后跟相同的memcpy,它也会起作用。对于这么小的情况,跳过 malloc() 和 memcpy() 会更实际,但这只是为了说明一点。对于这么小的事情,你会按照@kaylum 的建议去做。顺便说一句:在退出前不显式调用free()以释放内存是不好的做法。 -
关于最后一条评论:我从字面上使用了数字 2,但是当将长度传递给
memcpy()和 I/O 调用等时......通常你使用sizeof()来指代项或使用命名常量。使用严格的数字参数是不好的做法,因为它使调试代码正在执行的操作变得更加困难。操作系统将在程序退出时释放您的内存,但您应该始终习惯于在每次执行malloc()时考虑将free()调用放在哪里。malloc()不释放内存并创建泄漏是一个常见的坏习惯。总是小心 w/malloc()!
标签: c arrays pointers char malloc