问题描述
|
我在使用C语言中的字符串的基本原理时遇到麻烦。
我有一个功能:
char *editStr(char *str) {
char new[strlen(str)];
... do some editing ...
return new;
}
我将如何返回称为\“ new \”的字符数组。据我了解,该函数的返回值是char *,这意味着它正在请求一个指向字符串第一个字符的指针。
现在,我想问题是我正在返回一个数组字符。我试图返回一个指向\“ new \”中第一个字符的指针,但这似乎也不起作用。
我尝试了“返回* new [0] \”。
我的琴弦知识不好。
解决方法
这里有各种各样的问题,但是带有
return new;
的数组/指针问题不是其中之一。
首先,您要:
char new[strlen(str) + 1];
这样您就有足够的空间容纳空终止符。
您的new
被分配在堆栈上,因此将其返回只会引起悲伤和混乱;您将要:
char *new = malloc(strlen(str) + 1);
而是在函数返回时使内存仍然有效。
就您的实际问题而言,C中的数组是第一个元素的地址,因此您的return new;
很好(取决于上面提到的堆栈与堆问题)。 C数组在下降时会衰减到指针,因此您无需担心在声明函数以返回指针时返回数组。
,您正在返回指向您在堆栈上创建的对象的指针。你不能那样做。
您需要从堆中抽出“ 6”个内存并返回(然后在以后抽出“ 7”)
char *editStr(char *str) {
char *newArray = malloc(strlen(str) +1);
... do some editing ...
return newArray;
}
编辑:因为我忘记为字符串终止符添加1。如果要以原始字符串的副本开头,也可以使用strdup()
。
,这是我所看到的:
单词“ new”是C ++关键字。不要使用它来命名变量
如果要编辑字符串,请直接编辑str。
如果需要进行复制,请使用malloc(strlen(str))分配额外的内存。
,本文介绍了您遇到的问题及其处理方法。
在C中返回指向数组的指针的最佳方法是这样的:
char *getArr()
{
char *retbuf = malloc(25);
if(retbuf == NULL)
return NULL;
return retbuf;
}
,“ 3”变量是堆栈分配的,不能返回堆栈变量的引用。
char *editStr(char *str) {
char new[strlen(str)];
... do some editing ...
return new;
} // At this point,Unwinding of stack begins.
// new is on stack and the memory allocated to it is deallocated.
// So,the returned reference is only pointing to garbage.
相反,完成后应使用malloc和and13ѭ。
char *new = malloc( strlen(str) + 1 ) ; // +1 for the the termination character
,当创建一个普通的C数组时,它只会存在于创建它的作用域内(在本例中为函数editStr()
),并且从该函数返回后将立即销毁。因此,如果返回数组指针,它将变得无用,并且如果尝试使用它,则程序很可能崩溃。
相反,您应该使用malloc()
动态分配数组。相当容易使用:
char *a = (char*) malloc(sizeof(char) * 5);
这将创建一个可以使用的5×18数组,甚至可以在函数之间传递。但是,当它们超出范围时它们不会自动被破坏,因此在完成指针操作后,您需要使用ѭ19manually手动对其进行破坏,否则将导致内存泄漏。
也可以看看:
维基百科上的malloc
C ++参考中的malloc
malloc
联机帮助页
,如果您在单线程环境中工作并且立即使用该值,则可以将内部缓冲区设为静态,并且即使退出该函数,该缓冲区也将可用:
char *editStr(char *str) {
static char new[strlen(str)];
... do some editing ...
return new;
}
您也可以使用普通的sprintf样式:将指向缓冲区的指针传递给该函数并将其填充到内部。
int editStr(char *str,char *new,int new_size) {
... do some editing ...
return 0; //can return error
}