malloc可以处理int,但不能处理字符串

gstyhher  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(143)

我是一个非常新的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]
对不起,我的英语不好,这不是我的母语。再次感谢。

nfs0ujit

nfs0ujit1#

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

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

没有任何意义。
因为sizeof( char )总是等于1,所以只分配了2个字节。
如果要分配一个数组来存储字符串"Hello World!",则应编写如下代码

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

在这份声明中

*string = "Hello World!";

指针string被解引用。所以赋值语句的左边操作数(表达式*string等效于表达式string[0])具有类型char,而右侧操作数具有类型char[13](字符串文字具有字符数组类型)它被隐式转换为指向类型char *的字符串文本的第一个元素的指针。
所以在这个赋值语句中,你试图给一个字符赋值一个指针,编译器应该为这个语句发出一个消息,因为没有从指针到字符的隐式转换。
在这个printf调用中

printf("%s", *string);

您正尝试使用转换说明符%s将单个字符*string作为整个字符串输出,这会导致未定义的行为。
而不是这个声明

*string = "Hello World!";

你可以这样写

string = "Hello World!";

现在指针string指向字符串常量。如果你写

printf("%s", string);

则实际上将输出字符串文字。
但这会导致内存泄漏,因为在这种情况下,以前分配的内存地址将丢失。
要复制字符串常量的内容,应该使用在头文件<string.h>中声明的标准字符串函数strcpy

char *string = malloc( sizeof( "Hello World!" ) );
if ( string != NULL ) 
{
    strcpy( string, "Hello World!" );
    printf( "%s\n", string ); // or just puts( string );
}
zsbz8rwp

zsbz8rwp2#

声明;

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

仅为2字节分配内存。
然后:

*string = "Hello World!";

不会将字符串字面值"Hello World!复制到string
C标准库提供了strcpy来复制两个字符串,你也可以使用POSIX的strdup

printf的参数不正确:

printf("%s", *string);

%s说明符需要char **string生成char
将其更改为:

printf("%s", string);
  • 旁白 *:强制转换malloc和family的结果是多余的,可能会隐藏一个bug。这些函数返回一个void *,它会自动升级为正确的类型。

相关问题