返回C函数中的字符数组



我已经尝试了很多方法,但我无法让它发挥作用。我的设置说要使用char[],但我研究的所有内容都没有关于使用它的信息。这是我在下面的代码

#include <stdio.h>
#include <string.h>  
char[] makeString(char character,int count)
{
char finalString[count];
strcpy(finalString,character);
for(int i=1;i<=count;i++)
{
strcat(finalString,character);
}
return finalString;
}
int main() {
printf("%sn",makeString("*",5)); }

我正在尝试创建一个函数,该函数多次返回给定字符计数的字符串。非常感谢您的帮助。

如果这是一个非常简单的错误,我很抱歉,我大部分代码都是用python编写的,所以C对我来说是非常新的

有几个问题,主要是关于char finalString[count];

  1. finalString是在函数中创建的变量,它被称为局部变量。它将在函数返回后被销毁。

  2. 作为CCD_ 4变量的值的CCD_。在编译阶段无法确定其值,因此编译器无法为此数组分配内存空间。编译将失败。

修复此问题。

  1. 或者在外部创建这个变量并将其传递到函数中。或者在HEAP空间上创建变量。由于Heap space在整个程序中共享,因此不会受到函数结束的影响。

  2. 或者使用常数或者动态地分配具有malloccalloc等的存储器块。


这里有一个完整代码的演示:

// main.c
#include <stdio.h>
#include <string.h> 
#include <stdlib.h> 
char* makeString(char character,int count) {
char* finalString = malloc(count+1);  //dynamic allocate a chunk of space. +1 for mimic string end with an extra termination sign 0.
for(int i=0; i<count; i++) {
finalString[i] = character;
}
finalString[count] = 0; // string end signal 0
return finalString;  // the memory finalString pointed to is in the HEAP space.
}
int main() {
char * p = makeString('*',5);
printf("%sn",p);
free(p);  // free up the HEAP space
return 0;
}
  • 编译并运行代码。

    gcc -Wall main.c 
    ./a.out
    
  • 输出

    *****
    

数组在C中不是一流的类型——你可以用其他类型做很多你不能用数组做的事情。特别是,不能将数组作为参数传递给函数,也不能将其作为返回值返回

由于这个限制,如果您为参数或返回类型声明了一个具有数组类型的函数,编译器将(静默地(将其更改为指针,实际上您将传递或返回指针。这就是这里发生的事情——返回类型被更改为char *,并且您返回了一个指向超出范围的本地数组的指针,因此您最终得到的指针是悬空的。

您的代码不会编译。如果要返回数组,请执行char *而不是char []。函数返回后,像finalString这样的局部变量就超出了作用域。

这里有三种方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *initString(char *a, char c, int n) {
memset(a, c, n);
a[n] = '';
return a;
}
char *makeString(char c, int n) {
char *a = malloc(n + 1);
memset(a, c, n);
a[n] = '';
return a;
}
int main(void) {
printf("%sn", memset((char [6]) { 0 }, '*', 5));
char s[6];
initString(s, '*', (sizeof s / sizeof *s) - 1);
printf("%sn", s);
char *s2 = makeString('*', 5);
printf("%sn", s2);
free(s2);
}

相关内容

  • 没有找到相关文章

最新更新