提问人:Raxabi 提问时间:1/11/2023 最后编辑:Vlad from MoscowRaxabi 更新时间:1/11/2023 访问量:120
malloc 与 int 一起使用,但不能与字符串一起使用
malloc works with int but not with strings
问:
我是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]
对不起,我的英语不好,这不是我的母语。再次感谢。
答:
声明;
char* string = (char*)malloc(sizeof(char)+1);
仅为字节分配内存。2
然后:
*string = "Hello World!";
不会将字符串文本复制到 。"Hello World!
string
C 标准库提供复制两个字符串的功能。您也可以使用 POSIX 的 .strcpy
strdup
不正确的参数:printf
printf("%s", *string);
%s
格式说明符需要 ,生成 .char *
*string
char
将其更改为:
printf("%s", string);
旁白:投射 和 family 的结果是多余的,并且可能会隐藏一个错误。这些函数返回自动提升为正确类型的函数。malloc
void *
对于初学者来说,此内存分配
char* string = (char*)malloc(sizeof(char)+1);
没有意义。
只分配了 2 个字节,因为 总是等于 。sizeof( char )
1
如果你想分配一个将存储字符串的数组,那么你应该写"Hello World!"
char *string = malloc( sizeof( "Hello World!" ) );
在此声明中
*string = "Hello World!";
指针被取消引用。因此,赋值语句的左侧操作数(表达式等效于表达式)具有类型,而右侧操作数具有隐式转换为指向该类型的字符串文本的第一个元素的类型(字符串文本具有字符数组类型)。string
*string
string[0]
char
char[13]
char *
因此,在此赋值语句中,您尝试将指针分配给字符。编译器应为此语句发出消息,因为没有从指针到字符的隐式转换。
同样在printf的这个调用中
printf("%s", *string);
您正在尝试使用转换说明符将单个字符输出为整个字符串,这会导致未定义的行为。*string
%s
而不是这个声明
*string = "Hello World!";
例如,你可以写
string = "Hello World!";
也就是说,现在指针指向字符串文本。如果你会写string
printf("%s", string);
然后确实会输出字符串文字。
但这会导致内存泄漏,因为在这种情况下,先前分配的内存的地址将丢失。
要复制字符串文本的内容,您应该使用标头中声明的标准字符串函数。例如strcpy
<string.h>
char *string = malloc( sizeof( "Hello World!" ) );
if ( string != NULL )
{
strcpy( string, "Hello World!" );
printf( "%s\n", string ); // or just puts( string );
}
评论
*string = "Hello World!";
strcpy()
字符
,则可以工作。*
int*
char*
*string
char
string
printf
char *
%s
printf("%s",string);
malloc
malloc
*string = "Hello World!"
-->string = strdup("Hello World!");
strdup
char * strdup(const char *str) { size_t len = strlen(str) + 1; char *dup = malloc(len); if (dup != NULL) memcpy(dup,str,len); return dup; }