Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c中如何将数组值从一个函数传递到另一个函数_C_Arrays_String - Fatal编程技术网

在c中如何将数组值从一个函数传递到另一个函数

在c中如何将数组值从一个函数传递到另一个函数,c,arrays,string,C,Arrays,String,如何使用数组值?我在做字符串操作你不能。来自第一个函数的字符串是一个局部变量,在范围外访问它会导致未定义的行为。您可以动态分配字符串并将控制权交给用户。您不能。来自第一个函数的字符串是一个局部变量,在范围外访问它会导致未定义的行为。您可以做的是动态分配字符串并将其控制权交给用户。如果您的str是一个常量,如中所示 int string1() { char str[]="something" } int string2() { //here I need use array str[] from

如何使用数组值?我在做字符串操作

你不能。来自第一个函数的字符串是一个局部变量,在范围外访问它会导致未定义的行为。您可以动态分配字符串并将控制权交给用户。

您不能。来自第一个函数的字符串是一个局部变量,在范围外访问它会导致未定义的行为。您可以做的是动态分配字符串并将其控制权交给用户。

如果您的
str
是一个常量,如中所示

int string1()
{
char str[]="something"
}

int string2()
{
//here I need use array str[] from string1
}
它是一个字符串文本,您可以简单地返回
str
,它是一个数组,将衰减为数组的基址,因为它将位于只读内存中,并将一直保留到程序结束。 如果是这种情况,函数的返回类型应该是
char*
like

char str[]="something";

如果
str
不是这样

char *string1();
str
将在堆栈中分配,一旦控件退出声明它的函数,就无法访问它

为了避免这种情况,可以在堆上分配内存,如

char str[30];
strcpy(str, "hello");
一旦你用完了内存,别忘了释放它

char *string1()
{
    char *str=malloc(sizeof(char)*30);
    strcpy(str, "hello");
    return str;
}

请参阅。

如果您的
str
是一个常量,如中所示

int string1()
{
char str[]="something"
}

int string2()
{
//here I need use array str[] from string1
}
它是一个字符串文本,您可以简单地返回
str
,它是一个数组,将衰减为数组的基址,因为它将位于只读内存中,并将一直保留到程序结束。 如果是这种情况,函数的返回类型应该是
char*
like

char str[]="something";

如果
str
不是这样

char *string1();
str
将在堆栈中分配,一旦控件退出声明它的函数,就无法访问它

为了避免这种情况,可以在堆上分配内存,如

char str[30];
strcpy(str, "hello");
一旦你用完了内存,别忘了释放它

char *string1()
{
    char *str=malloc(sizeof(char)*30);
    strcpy(str, "hello");
    return str;
}

请参阅。

您可以在函数定义块中使用静态变量,它具有全局存储,但访问范围有限,需要访问时,只需通过函数调用获取指针即可。代码如下:

char *p=string1();
printf("\n%s", p);
free(p);

您可以在函数定义块中使用静态变量,这具有全局存储但访问范围有限,当需要访问它时,只需通过函数调用获取指针。代码如下:

char *p=string1();
printf("\n%s", p);
free(p);

每个人都必须学习如何使用数组、字符串、指针和函数,以及如何将数组和指针传递给函数和处理函数返回

声明变量(包括数组类型)时,变量的生存期仅存在于声明的范围内,除非动态分配变量的内存,或声明为
静态
或具有静态存储持续时间

为什么??函数中声明的变量的存储在函数堆栈上创建,函数堆栈在函数返回时被销毁(释放以供重用)。(
main()
本身就是一个函数)。现在,函数始终可以返回其自身类型的值,但它不能在函数中声明自动存储的类型数组并返回指向该数组的指针

len: 5
char at: 0 is h
char at: 1 is e
char at: 2 is l
char at: 3 is l
char at: 4 is o
您有一些选择,但它们依赖于了解“某物”的存储持续时间以及确切的存储时间。让我们看看您似乎在尝试做什么:

char str[]="something";    /* violates that rule.... */
上面有一些微妙之处。第一个
“something”
是一个字符串文本,它在程序的生命周期内具有静态存储持续时间。因此,您正在分配在只读内存中创建的
“something”
的地址,该内存将在
string1
返回后仍然有效。由于函数始终可以返回它自己的类型(在本例中为该目的选择的
const char*
),因此可以将地址返回到
“something”

要在
string2
中使用
s
,必须将
s
作为参数传递给
string2
,或将
string1
的返回值分配给全局指针(不鼓励)。由于
s
指向只读内存,因此应将传递给
string2
的参数声明为
const char*
,以表示无法修改该参数。类似于:

/* retuning pointer to string literal */
const char *string1 ()
{
    const char *s = "something";

    return s;
}
总而言之,您可以执行以下操作:

/* simply use string 's' in string2 */
void string2 (const char *s)
{
    printf ("in string2(), s : %s\n", s);
}
$ ./bin/literalreturn
in string2(), s : something
注意:由于字符串文字静态存储持续时间,您只能在
string1
中返回
s
。否则,您需要将
s
作为参数传递给
string1
,或者在
string1
中为
s
动态分配存储,并返回指向新内存块起始地址的指针

如果要将字符数组传递给
string1
,则需要执行以下类似操作:

/* simply use string 's' in string2 */
void string2 (const char *s)
{
    printf ("in string2(), s : %s\n", s);
}
$ ./bin/literalreturn
in string2(), s : something
#包括
#包括
#为数组大小定义MAXC 32/*常量*/
/*任何时候传递数组时,传递大小*/
字符*string1(字符*s,最大大小)
{
如果(最大值<2){
fprintf(stderr,“错误:最大大小不足。\n”);
返回NULL;
}
如果(标准长度<最大值-1)
strcpy(s,“某物”);
返回s;
}
/*只需使用字符串's'*/
无效字符串2(常量字符*s)
{
printf(“在string2()中,s:%s\n”,s);
}
内部主(空){
char buf[MAXC]=“”;/*声明MAXC字符的字符数组*/
/*调用字符串2传递字符串1传递数组和大小*/
string2(string1(buf,sizeof buf));
返回0;
}
(由于
s
string2
中没有更改,因此它仍然作为
const char*s
正确传递,这允许对代码进行某些编译器优化。)


检查一下。你必须理解每个例子的微妙之处,因为这些概念是C语言的基础。如果你还有其他问题,请告诉我。

每个人都必须学习如何使用数组、字符串、指针和