怎么样为malloc申请的字串赋值

C语言 码拜 8年前 (2017-05-08) 2072次浏览
原帖在这里:
http://bbs.csdn.net/topics/392139009?page=1#post-402183908
原因是本人手太快了,所以重新发出,给各位好心的前辈分值。
问题列表:
【已了解】那本人该怎么样确定这块地址能否真的被释放了呢?
void * free(void *p):
【尚存疑问】1、这个操作返回空,将返回空的函数作为指针函数有什么意义?
【尚存疑问】2、void *p是什么概念?不是已经void了么?将*p指为void怎么样符合之后写入的参数?……
【尚存疑问】3、void怎么样使用该参数?
关于a地址改变了的问题:

a = (char *)malloc(10*sizeof(char));
    a = "hello";
    b = a;

【尚存疑问】为啥a的地址改了?为什么不是原先malloc申请的地址了?
【尚存疑问】怎么样在malloc申请的那个地址里保存“hello”?

解决方案

15

【尚存疑问】为啥a的地址改了?为什么不是原先malloc申请的地址了?

a的地址没改变,而是a的值改变了。
【尚存疑问】怎么样在malloc申请的那个地址里保存“hello”?
---
memcpy

15

【尚存疑问】1、这个操作返回空,将返回空的函数作为指针函数有什么意义?
返回空就是不需要返回值。
【尚存疑问】2、void *p是什么概念?不是已经void了么?将*p指为void怎么样符合之后写入的参数?……
用void *作为形参类型是为了通用。任意类型的指针可以隐式的转成void *类型。
【尚存疑问】3、void怎么样使用该参数?
将malloc返回值地址填入即可

20

指针变量a里存放的是地址,malloc返回的是在堆上申请的空间的首地址,放在指针变量a里。
a = “hello”;这句是将hello字符串的首地址放在了指针变量里,就是将之前的存放的堆上的地址覆盖了。
可以通过打印这两个地址(%p)来验证;
字符串赋值可以考虑strcpy,strncpy或memcpy;

strncpy(a, "hello", strlen("hello")+1);

这句是将字符串“hello”拷贝到堆上申请的空间里。

20

malloc返回的是void *,该类型void *转换成其他基本类型,例如int *, char *等等都是自动转换的。

20

1、free函数的返回值是void,而不是void*
http://en.cppreference.com/w/c/memory/free
2、void*可以表示任意类型的指针,任意类型指针均可隐式转换为void*
3、void参数表示不需要传入参数

40

引用

为啥a的地址改了?为什么不是原先malloc申请的地址了?

malloc申请到一个地址赋值给a,之后的a = “hello”; 使a指向了常量区的字符串,也就是又改变了a指向的地址

引用

怎么样在malloc申请的那个地址里保存“hello”?

a = “hello”;
改成:
strcpy(a, “hello”);


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么样为malloc申请的字串赋值
喜欢 (0)
[1034331897@qq.com]
分享 (0)