malloc 与 int 一起使用,但不能与字符串一起使用

malloc works with int but not with strings

提问人:Raxabi 提问时间:1/11/2023 最后编辑:Vlad from MoscowRaxabi 更新时间:1/11/2023 访问量:120

问:

我是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]

对不起,我的英语不好,这不是我的母语。再次感谢。

C printf 动态内存分配 c-strings 赋值运算符

评论

2赞 tadman 1/11/2023
提示:不是你怎么做的。看:。*string = "Hello World!";strcpy()
0赞 tadman 1/11/2023
提示:您需要通过取消引用来复习哪些内容是可复制的,哪些是不可复制的。 是一个微不足道的副本,如果您复制单个字符,则可以工作。*int*char*
1赞 David Ranieri 1/11/2023
更多提示:“Hello World!”不适合 2 个字节
0赞 Craig Estey 1/11/2023
Doing 返回第一个 ,但需要 for 。所以,你想要: 但是,你只为一个字节分配空间 - 没有足够的空间给一个需要 EOS (0x00) 终止符空间的字符串。The TL;DR是:放弃和改变*stringcharstringprintfchar *%sprintf("%s",string);mallocmalloc*string = "Hello World!" --> string = strdup("Hello World!");
0赞 Craig Estey 1/11/2023
您可以/应该查找 .但是,您需要的代码与它类似。下面是一个简单的示例:strdupchar * strdup(const char *str) { size_t len = strlen(str) + 1; char *dup = malloc(len); if (dup != NULL) memcpy(dup,str,len); return dup; }

答:

2赞 Harith 1/11/2023 #1

声明;

char* string = (char*)malloc(sizeof(char)+1);

仅为字节分配内存。2


然后:

*string = "Hello World!";

不会将字符串文本复制到 。"Hello World!string

C 标准库提供复制两个字符串的功能。您也可以使用 POSIX 的 .strcpystrdup


不正确的参数:printf

printf("%s", *string);

%s格式说明符需要 ,生成 .char **stringchar

将其更改为:

printf("%s", string);

旁白:投射 和 family 的结果是多余的,并且可能会隐藏一个错误。这些函数返回自动提升为正确类型的函数。mallocvoid *

2赞 Vlad from Moscow 1/11/2023 #2

对于初学者来说,此内存分配

char* string = (char*)malloc(sizeof(char)+1);

没有意义。

只分配了 2 个字节,因为 总是等于 。sizeof( char )1

如果你想分配一个将存储字符串的数组,那么你应该写"Hello World!"

char *string = malloc( sizeof( "Hello World!" ) );

在此声明中

*string = "Hello World!";

指针被取消引用。因此,赋值语句的左侧操作数(表达式等效于表达式)具有类型,而右侧操作数具有隐式转换为指向该类型的字符串文本的第一个元素的类型(字符串文本具有字符数组类型)。string*stringstring[0]charchar[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 );
}