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

时间:2017-09-28 01:20:47

标签: c arrays string

grep("(?=.*1)(?=.*0)", iphod$a)

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

4 个答案:

答案 0 :(得分:3)

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

当声明变量(包括数组类型)时,变量的生命周期仅存在于声明的范围内,除非动态分配变量的内存或声明为static或其他< em>静态存储持续时间。

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

char str[]="something";    /* violates that rule.... */

您有几个选项,但它们依赖于了解"something"的存储持续时间以及它的确切含义。让我们来看看你试图做的事情:

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

    return s;
}

上面有一些细微之处。第一个"something"字符串文字,它在程序生命周期内具有静态存储持续时间。因此,您要分配在只读内存中创建的"something"的地址,该地址将在string1返回后继续存在。由于函数可以始终返回自己的类型(在这种情况下为const char * - 为此目的而选择),因此您可以将地址返回到"something"

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

/* simply use string 's' in string2 */
void string2 (const char *s)
{
    printf ("in string2(), s : %s\n", s);
}

完全放弃,您可以执行以下操作:

#include <stdio.h>

/* 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);
}

int main (void) {

    /* call string 2 passing string1 as the parameter */
    string2 (string1 ());

    return 0;
}

示例使用/输出

$ ./bin/literalreturn
in string2(), s : something

注意:由于字符串文字静态存储持续时间,您只能在s中返回string1。否则,您需要将s作为参数传递给string1,或者在s内为string1动态分配存储空间,并返回指向新块的起始地址的指针。存储器中。

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

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

#define MAXC 32     /* constant for array size */

/* anytime you are passing an array, pass the size. */
char *string1 (char *s, size_t max)
{
    if (max < 2) {
        fprintf (stderr, "error: insufficient max size.\n");
        return NULL;
    }

    if (strlen (s) < max - 1)
        strcpy (s, "something");

    return s;
}

/* simply use string 's' */
void string2 (const char *s)
{
    printf ("in string2(), s : %s\n", s);
}

int main (void) {

    char buf[MAXC] = "";  /* declare character array of MAXC chars */

    /* call string 2 passing string1 passing array and size */
    string2 (string1 (buf, sizeof buf));

    return 0;
}

(由于s中的string2未更改,因此它仍然正确传递为const char *s,这允许对代码进行某些编译器优化。)

仔细看看。你必须理解每个例子的细微之处,因为这些概念都是C的基础。如果你有其他问题,请告诉我。

答案 1 :(得分:1)

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

char* string1() {
    static char s[64] = "hello"; //this memory has 64 chars

    return s;
}


int main(int argc , char *argv[])
{
    char* s = string1();
    int len = strlen(s);

    printf("len: %d\n", len);

    for (int i = 0; i < len; ++i) {
        printf("char at: %d is %c\n", i, s[i]);
    }
}

输出:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您的str

中的常量
char str[]="something";

它是一个字符串文字,你可以简单地返回str作为一个数组,将衰减到数组的基地址,因为它将在只读内存中并将保留在那里直到程序结束。 如果是这种情况,函数的返回类型应为char *,如

char *string1();

请参阅demo

如果str不是,

char str[30];
strcpy(str, "hello");

str将在堆栈中分配,一旦控制退出声明它的函数,就无法访​​问它。

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

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

一旦你完成使用它,不要忘记释放内存。

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

请参阅demo