将 char 指针传递给辅助函数并在 C 中赋值的正确方法
Correct way to pass the char pointer to helper fuction and assign the value in 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";
}
我的第一个问题是我们不能直接给指针赋值的原因是什么?
我之前的理解是因为 space "hello" 只在 changeValue 范围内创建,一旦离开 changeValue 函数,它就会被销毁。但是,如果我使用指针的指针来分配它起作用的值。似乎“你好”space 没有被破坏:
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' 指向分配的内存(6 字节)。在第二个版本中,p2 指向将包含一个地址的内存。
在您的辅助函数的第一个版本中:
void changeValue(char* input){
input = "hello";
}
在该函数之外,'p' 仍指向分配的内存。当程序进入 changeValue() 函数时,'p' 的值被压入堆栈,现在它被一个名为 'input'... 的新字段引用,该字段仅存在于堆栈中。因此,通过将文字“hello”分配给它,您已将 'p' 替换为字符串文字“hello”的地址。
同时,'p' 的位置与 'input' 不同。一旦函数returns,临时分配给'input'的内存已经被弹出,不再相关
也许图表可以提供帮助:
最初:
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) |
+-------+ +------------------+
并且在 main 函数的末尾,您现在有内存泄漏(malloc 的内存尚未被释放)。
辅助函数的一种正确使用方法是:
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) 相同。 ”
我有一些关于在辅助函数中将值赋给 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";
}
我的第一个问题是我们不能直接给指针赋值的原因是什么? 我之前的理解是因为 space "hello" 只在 changeValue 范围内创建,一旦离开 changeValue 函数,它就会被销毁。但是,如果我使用指针的指针来分配它起作用的值。似乎“你好”space 没有被破坏:
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' 指向分配的内存(6 字节)。在第二个版本中,p2 指向将包含一个地址的内存。
在您的辅助函数的第一个版本中:
void changeValue(char* input){
input = "hello";
}
在该函数之外,'p' 仍指向分配的内存。当程序进入 changeValue() 函数时,'p' 的值被压入堆栈,现在它被一个名为 'input'... 的新字段引用,该字段仅存在于堆栈中。因此,通过将文字“hello”分配给它,您已将 'p' 替换为字符串文字“hello”的地址。
同时,'p' 的位置与 'input' 不同。一旦函数returns,临时分配给'input'的内存已经被弹出,不再相关
也许图表可以提供帮助:
最初:
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) |
+-------+ +------------------+
并且在 main 函数的末尾,您现在有内存泄漏(malloc 的内存尚未被释放)。
辅助函数的一种正确使用方法是:
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) 相同。 ”