我是一个非常新的c语言。我试图学习有关内存分配与下一个例子。
如果我像这样为一个整数分配内存:
int* pint = (int*)malloc(sizeof(int));
if (pint == NULL) {
printf("NULL pointer!");
} else {
*pint = 5;
printf("el valor es: %d", *pint);
free(pint);
}
这完美地显示了数字5,并且正确地释放了内存
但如果我尝试对这样的字符串做同样的操作:
char* string = (char*)malloc(sizeof(char)+1);
if (string == NULL) {
printf("NULL pointer!");
} else {
*string = "Hello World!";
printf("%s", *string);
free(string);
}
为什么会发生这种情况,我该如何解决?
先谢了
- 编辑**
对不起,我忘了显示c编译器抛出的错误,我的错。
错误为:
警告:从"char *"赋值给"char"会使指针从整数变为无类型转换的整数[-Wint-conversion]
对不起,我的英语不好,这不是我的母语。再次感谢。
2条答案
按热度按时间nfs0ujit1#
对于初学者来说,这种内存分配
没有任何意义。
因为
sizeof( char )
总是等于1
,所以只分配了2个字节。如果要分配一个数组来存储字符串
"Hello World!"
,则应编写如下代码在这份声明中
指针
string
被解引用。所以赋值语句的左边操作数(表达式*string
等效于表达式string[0]
)具有类型char
,而右侧操作数具有类型char[13]
(字符串文字具有字符数组类型)它被隐式转换为指向类型char *
的字符串文本的第一个元素的指针。所以在这个赋值语句中,你试图给一个字符赋值一个指针,编译器应该为这个语句发出一个消息,因为没有从指针到字符的隐式转换。
在这个printf调用中
您正尝试使用转换说明符
%s
将单个字符*string
作为整个字符串输出,这会导致未定义的行为。而不是这个声明
你可以这样写
现在指针
string
指向字符串常量。如果你写则实际上将输出字符串文字。
但这会导致内存泄漏,因为在这种情况下,以前分配的内存地址将丢失。
要复制字符串常量的内容,应该使用在头文件
<string.h>
中声明的标准字符串函数strcpy
。zsbz8rwp2#
声明;
仅为
2
字节分配内存。然后:
不会将字符串字面值
"Hello World!
复制到string
。C标准库提供了
strcpy
来复制两个字符串,你也可以使用POSIX的strdup
。printf
的参数不正确:%s
说明符需要char *
,*string
生成char
。将其更改为:
malloc
和family的结果是多余的,可能会隐藏一个bug。这些函数返回一个void *
,它会自动升级为正确的类型。