如何解决将char指针传递给辅助函数并在C中分配值的正确方法
我对在辅助函数中将值分配给char *有一些疑问。如果我有以下代码
int main() {
char *p = malloc(6* sizeof(char));
changeValue(p);
printf("value of p=%s\n",p);
return 0;
}
如果我定义以下函数,那么它将不起作用:
void changeValue(char* input){
input = "hello";
}
我的第一个问题是我们不能直接将值分配给指针的原因是什么? 我以前的理解是因为空间“ hello”仅在changeValue范围内创建,并且一旦超出changeValue函数,就会被销毁。但是,如果我使用指针的指针来分配值,它将起作用。好像“ hello”空间没有被破坏:
void changeValue(char ** input){
*input = "hello";
}
主要我需要更改为:
char **p2 = malloc(sizeof(char*));
changeValue(p2);
printf("value of p2=%s\n",*p2);
它正常工作。我的第二个问题是第二个功能发生了什么变化,以使其正常工作?在我以前的逻辑中哪一部分是错误的?
我还找到了以下分配值的方法:
changeValue函数保持不变:
void changeValue(char ** input){
*input = "hello";
}
在主cpp中,我执行以下操作:
char *p = malloc(6* sizeof(char));
changeValue(&p);
printf("value of p=%s\n",p);
似乎它也可以正常工作,但是对我来说没有任何意义。我的第三个问题是输入是内存中p的地址,如何取消引用该地址并为其分配值?
在辅助函数中分配char *值的正确方法是什么?
谢谢
解决方法
在第一个版本中,“ p”指向malloc分配的内存(6个字节)。在第二版中,p2指向将包含地址的内存。
在辅助功能的第1版中:
void changeValue(char* input){
input = "hello";
}
在该函数之外,“ p”仍指向已分配的内存。当程序进入changeValue()函数时,将'p'的值压入堆栈,现在由新字段'input'引用它,该字段仅存在于堆栈中。因此,通过将其分配为文字“ hello”,您已将“ p”替换为字符串文字“ hello”的地址。
与此同时,“ p”的位置与“输入”的位置不同。函数返回后,临时分配给“输入”的内存就会弹出,不再有用。
也许图表可以帮助您
起初:
char *p = malloc(6* sizeof(char));
(Stack) (Heap)
+-------+ +------------------+
| p +--------> | 6 * sizeof(char) |
+-------+ +------------------+
接下来,呼叫:
changeValue(p); // first version
会影响以下内容:
(Stack) (Heap)
+-------+
| input +----+
+-------+ | +------------------+
| p +----+---> | 6 * sizeof(char) |
+-------+ +------------------+
然后:
input = "hello";
(Stack) (Heap) (DataSegment)
+-------+ +-------+
| input +----------------------------------->|"hello"|
+-------+ +------------------+ +-------+
| p +-----> | 6 * sizeof(char) |
+-------+ +------------------+
,从'changeValue'退出后,堆栈将退绕,并且'input'不再相关。
(Stack) (Heap)
+-------+ +------------------+
| p +--------> | 6 * sizeof(char) |
+-------+ +------------------+
在主函数的结尾,您现在遇到了内存泄漏(未释放分配的内存)。
使用助手功能的一种正确方法是:
int main() {
char *p = malloc(6* sizeof(char));
changeValue(p,6* sizeof(char) );
printf("value of p=%s\n",p);
free( p ) ; // <<<<<< avoid memory leak
return 0;
}
void changeValue(char * input,size_t maxSize){
// ... Copy "hello" into the space pointed to by input,taking
// care not to overrun the memory
strncpy( input,"hello",maxSize ) ;
}
,
关于这个问题,我认为存储指针s的内存是两个不同的概念,内存的大小取决于系统,指针s指向的内存分配了6个字节。 >
“代码的第三位(char p = malloc(6 sizeof(char)); changeValue(&p);)错误,因为p指向的内存可能不够大,无法保持指针。在具有64位指针的系统上,sizeof(char *)通常为8,大于您分配的6 * sizeof(char)。顺便说一句,sizeof(char)根据定义为1,因此malloc(6 * sizeof(char))与malloc(6)相同。 ”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。