【问题标题】:How do I pass a string array from a function to main [duplicate]如何将字符串数组从函数传递到主[重复]
【发布时间】:2016-05-24 10:27:34
【问题描述】:

我正在尝试在 Initialize 中初始化一个字符串,然后将其传递给 int main() 以进行屏幕输出,但似乎已初始化的字符串已变为损坏。

标题

#include<stdio.h>
#include<stdlib.h>

初始化

void
Initialize(char* STRINGs)
{
    STRINGs = malloc(sizeof(char)*5);
    STRINGs = "hello" ;

    printf("1: %s\n",STRING);
}

主要

int
main (char* STRINGs)
{
    Initialize(STRINGs);

//The program stops working when it reaches this section
    printf("2: %s",STRINGs);
    return 0;
}

【问题讨论】:

  • 你需要学习strcpy和大量的字符串操作,malloc之前的指针。
  • 程序从main函数开始。所以你应该使用另一个函数在main 中完成你想要的任务。
  • 此int main (char* STRINGs) 无效 C。请使用int main (void) 或int main (int argc, char * argv[]) 或int main (int argc, char ** argv)。

标签: c arrays function pointers


【解决方案1】:

您可以使用此代码来初始化字符串变量

  char * Initialize()
  {
    char* STRINGs="HELLO";

     printf("1: %s\n",STRINGs);

     return STRINGs;
  }

int main ()
{

 char *strings =Initialize();

 //The program stops working when it reaches this section
 printf("2: %s",strings);
 return 0;
}

【讨论】:

  • char * Initialize() 应该是char * Initialize(void)。
  • 解释为什么这会很好地解决这个问题。就目前而言,它并没有太大帮助。
  • 看他问的问题。他想在函数中将变量初始化为字符串。所以根据问题的要求,我的ans可能会满足这个问题。
  • 请解释为什么应该是char * Initialize(void)而不是char * Initialize()
  • 请参阅当前的 C 标准。来自 C11 标准(草案)6.11.7 (port70.net/~nsz/c/c11/n1570.html#6.11.7):“使用具有单独参数标识符和声明列表(不是原型格式参数类型和标识符声明符)的函数定义已过时。 i>"
【解决方案2】:

首先,int main (char* STRINGs) 的原型有误,必须是:

  • int main(),或
  • int main( int argc, char *argv[] )

如何将字符串数组从函数传递到 main

就目前而言,您可以在 Initialize() 中创建一个字符串,然后返回一个指向该字符串的指针。

不过,您的 Initialize() 中有几个问题。

以下是修改建议:

char * 
Initialize()
{
    char *STRINGs = malloc(strlen("hello") + 1);  // <-- malloc must include an additional space for the NULL terminator.
    strcpy( STRINGs, "hello" );  // <-- NEVER use assignment for string type.
    printf("1: %s\n",STRINGs);
    return STRINGs;
}

那么你的main()可以是这样的:

int main()
{
    char *str = Initialize();
    printf( "str = %s\n", str );
    return 0;
}

注意:不要忘记添加#include &lt;string.h&gt;

【讨论】:

  • 为什么是sizeof(char)* (strlen("hello") + 1)?由于sizeof(char) 始终为1,代码可以使用strlen("hello") + 1,或者如果尝试考虑类型的大小,请使用sizeof *STRINGs * (strlen("hello") + 1)。
  • @chux sizeof( char )(而不是1)更适合让它显式。但是我看到这个案例看起来有点麻烦。我正在根据您的评论编辑代码 - 谢谢。
  • char * Initialize() 应该是char * Initialize(void)。
【解决方案3】:

这是一个答案。首先,当为任何变量分配内存时,它必须被释放,否则你会在某些时候遇到一些令人讨厌的系统错误,或者至少是内存泄漏。

在 int main() 中,理想情况下,声明应该是 int main(int argc, char* argv[])。

我还建议至少再分配一个字节的内存,以防万一您创建一个字符串并且您稍后使用的函数需要附加一个空字符。

我修复了您的代码,使其以最低限度工作。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* Initialize(){
  char* string = malloc(sizeof(char)*6);
  strcpy(string,"hello");
  printf("1: %s\n",string);
  return string;
}

int main (int argc, char* argv[]){
  char *strings=Initialize();
  printf("2: %s\n",strings);
  free(strings);
  return 0;
}

对于您的代码的较短版本,我建议这样做:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char* argv[]){
  char* strings=malloc(6);
  strcpy(string,"hello");
  printf("2: %s\n",strings);
  free(strings);
  return 0;
}

【讨论】:

  • char * Initialize() 应该是char * Initialize(void)。
【解决方案4】:

为了便于理解,我们假设main函数的STRINGs是a。

而initialize函数的STRINGs是b。

首先,a 主要指向某个未知位置,例如 u。当您将此传递给 initialize 函数时,b 也开始指向位置 u。

但是,在分配内存之后,b 开始指向由malloc 分配的其他一些内存,比如m。

现在您可以使用b 更改内存m 的内容。但是a仍然指向未知位置u。

所以两个指针现在都指向两个不同的内存位置。因此,当您打印 b 指向的内容时,它可以完美运行,然后您的 printf 内容 a 没有特定位置或可能是 null。

所以,正因为如此,你的问题来了。

此外,您的程序中还有另一个错误,即在initialize 函数的printf 中,它给出了一个未声明的参数STRING....使它成为STRINGs。

希望你会喜欢这个解释。它有点棘手。

谢谢:-)

【讨论】:

  • 哦,我虽然 void 函数与 main 共享变量,而 malloc 只是扩展了内存。这将消除一些误解。谢谢
  • 很好解释。但是“null”应该读作“NULL”,因为null是不同的东西。
【解决方案5】:

你可以使用:

void Initialize(char** STRING)

改为:

void Initialize(char* STRINGs)

因为你想改变STRING指向的地址

你也有错误的main原型

试试:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void Initialize(char** STRING)
{
    *STRING = malloc(6);
    strcpy(*STRING, "hello");

    printf("1: %s\n",*STRING);
}


int main (int argc, char *argv[])
{
    char* STRING;

    Initialize(&STRING);

    printf("2: %s\n",STRING);

    free(STRING);
    return 0;
}

【讨论】:

  • 成功了!谢谢
  • 它可以工作的事实并不一定意味着它是一个好的解决方案。通常最好避免使用指向指针的指针,除非你必须这样做——在这种情况下你当然不需要
猜你喜欢
  • 1970-01-01
  • 2013-05-15
  • 2021-12-19
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
相关资源
最近更新 更多