我尝试在初始化中初始化字符串,然后将其传递给 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;
}
答案 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
函数的main
为a
。
STRINGs
函数的initialize
为b
。
首先,在主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;
}