从函数返回字符串时有麻烦

问题描述

| 我在使用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
 }