【发布时间】:2021-06-29 13:35:07
【问题描述】:
在下面的代码中,我通过值将指针传递给我希望将 N 个字符串连接到原始字符串的函数。
按照我的编写方式,我通过计算要在原始字符串长度上添加多少字节来分配新内存。
然后填充这个新字符串并返回指向该字符串的指针。
所以,假设原始指针msg 是0x000001,它指向字符串"Hello\0" 的起始字符。
然后在函数中,一个新的指针strNew最终指向"Hello world, poop\0",其值为0x0000f5,新字符串的内存所在的位置。
然后,作为函数的返回,msg 指针的值现在是 0x0000f5。
我的问题是,位于0x000001 的内存会发生什么变化?它包含"Hello\0" 的字节,但不再有指向它的指针。它会收集垃圾吗?这是个问题吗?我应该用“”字符以某种方式覆盖内容吗?
如果没有,如何从 strcatcat() 函数中释放它?
这个想法是不必担心字符数组的大小足以让字符串开始。这不合理吗?
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
char * strcatcat(char * orig, const char* strArgs, ...){
va_list valist;
unsigned long initStrLength = strlen(orig);
// work out how much me to realloc
unsigned long moreBytes = 0;
va_start(valist, strArgs);
const char* str = strArgs;
while (str != NULL ) {
moreBytes += strlen(str);
str = va_arg(valist, const char *);
}
// define a new char pointer to populate, of defined size
char * strNew = NULL;
strNew = (char *) malloc((moreBytes + initStrLength+1));
// copy the original string into the start
strcpy(strNew, orig);
//reset, then go through and concat into new string
va_start(valist, strArgs);
str = strArgs;
while (str != NULL ) {
strcat(strNew, str);
str = va_arg(valist, const char *);
}
// close list
va_end(valist);
// return this pointer
return strNew;
}
int main()
{
char * msg = "Hello";
msg = strcatcat(msg, " World, ", "poop", NULL);
printf("%s\n", msg);
return 0;
}
编辑:谢谢大家,这已经清除了。我习惯了更高级别的语言,如 PHP、C# 等,并阅读了有关指针算法的信息,弹出了这个问题,我找不到不关注指针而不是指针值的答案。
未来人们的 TLDR - 如果没有调用者管理它,我给出的示例会导致内存泄漏。 main 中的指针需要复制才能解除分配。
【问题讨论】:
-
什么也没发生。据说那个记忆已经“泄露”了。您不再有任何对它的引用,因此您无法使用它,但它会继续消耗资源,直到进程退出。
-
但是在这种情况下,您的原始指针没有分配在堆上,所以....这根本不是问题。
标签: c pointers memory-management string-literals