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

时间:2016-02-13 06:07:15

标签: c arrays function pointers

我尝试在初始化中初始化字符串,然后将其传递给 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;
}

5 个答案:

答案 0 :(得分:3)

首先,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 <string.h>

答案 1 :(得分:3)

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

  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;
}

答案 2 :(得分:1)

这是一个答案。首先,在为任何变量分配内存时,必须将其释放,否则您将在某个时刻或至少发生内存泄漏时出现一些令人讨厌的系统错误。

在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;
}

答案 3 :(得分:1)

为了便于理解,我们假设STRINGs函数的maina

STRINGs函数的initializeb

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

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

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

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

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

此外,您的程序中存在另一个错误,该错误位于printf initialize函数中,它提供了一个未声明的参数STRING .... make it { {1}}。

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

谢谢: - )

答案 4 :(得分:0)

您可以使用:

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;
}