在C中返回一个bool数组

时间:2014-01-29 13:22:21

标签: c arrays pointers

我生成一个56位的0和1字符串。

所以这是我的代码:

#include <time.h>
#include <stdlib.h>

#include "genkey.h"

static char * genkey()
{
    srand(time(NULL));
    int rr;
    char key[7];

    for(int ii = 0; ii < 7; ii++)
    {
    key[ii] = rand() % 255;
    }

    return *key;
}

int main()
{
    char truc[64] = genkey();
    printf("%s", truc);

    return EXIT_SUCCESS;
}

我无法编译它。我不明白为什么。

6 个答案:

答案 0 :(得分:4)

您正在返回指向局部变量的指针。一旦函数返回,该变量就超出了范围。当您尝试取消引用此指针时,这会导致未定义的行为

更不用说您将首先获得编译错误,因为您实际上没有返回指针(return *key返回key指向的值)并且您无法初始化数组以这种方式在main函数中。

我建议您不要返回指针,而是将数组作为参数传递给函数进行初始化。例如,

void genkey(bool *key)
{
    ...
}

int main(void)
{
    bool truc[64];
    genkey(truc);

    ...
}

答案 1 :(得分:1)

这是非常错误的。您将返回指向本地不再存在的数组的指针。使用

void genkey(bool* key, unsigned size)
... (of course without declaring key in the function)

bool key[64];
genkey(key, 64); // better to use #define instead

BTW bool不是一位,而是一个字节。

答案 2 :(得分:0)

首先,您要声明一个64 字节的数组,每个数组只包含一个布尔信息,1或0.如果您希望提高内存效率,请在一个或多个上使用位掩码几个字节。

然后,这是如何解决您的问题:

#include <time.h>
#include <stdbool.h>
#include <stdlib.h>

#include "genkey.h"

bool* genkey(bool* key)
{
    srand(time(NULL));
    int rr;

    for(int ii = 0; ii < 64; ii++)
    {
    rr = rand();
    key[ii] = rr;
    }
}

int main()
{
    bool key[64];
    genkey(key);
    printf("%s", truc);

    return EXIT_SUCCESS;
}

请阅读K&R或更好的文档http://www.chiark.greenend.org.uk/~sgtatham/cdescent/,该文档针对的是来自更高抽象语言的人。您需要了解内存管理和变量范围!

答案 3 :(得分:0)

在C中,函数只能返回简单类型,而不是数组。

static bool* genkey()
{
    bool key[64];
    ...
    return *key;
}

此处keybool*,但您尝试返回*key,其解除引用key并因此返回其第一个元素。这显然不是函数声明所说的指向bool(即bool*)的指针。

假设您将其更改为我认为您的意思:

static bool* genkey()
{
    bool key[64];
    ...
    return key;
}

这仍然是错误的,因为key是指向堆栈上分配的数组的指针。当函数退出时,key[]的内容将丢失。因此,返回指向该key数组的指针总是错误的,因为它可能是未定义的。

您需要做的是在堆上分配数组,并在使用后在调用者中释放它。类似的东西:

static bool* genkey()
{
    bool *key = malloc(64 * sizeof bool);
    ...
    return key;
}

int main()
{
    bool *truc = genkey();
    ...
    free (truc);

    return EXIT_SUCCESS;
}

作为替代方案,在main()中(在堆或堆栈上)分配数组并将指针传递给genkey

读者留下的剩余问题:

  1. 错误处理。

  2. 你不能printf指向布尔数组的指针并期望得到明智的结果。

  3. 使用bool数组不是存储位域的有效方法;不可否认,它是可读的,对于64字节,人们可能会说“谁在乎?”

答案 4 :(得分:0)

您的代码中存在许多问题。除了别人所说的,你要为数组赋值

char truc[64] = genkey();

在C中被禁止。数组只能通过{ }对中的值进行初始化。这就是程序没有编译的原因

更糟糕的是,函数的返回值是数组中的一个字节,而不是地址。即使它是地址,您也将面临未定义的行为,因为它是一个本地数组,在退出范围后结束其生命。此外,您在程序中生成8个字节,然后期望它在main

中分配为64个字节

错误列表仍未结束。你不用包括“stdio.h”就调用printf。启用警告,您将看到函数消息的隐式声明。

还有一件事,C中的主要是int main(void)

答案 5 :(得分:0)

这是一个有效的例子。

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

/* allocates an array of random bits
 * char [0]{bit0, bit1, bit2, ... bit7}, char[1]{bit8, bit9 ... }
 */
unsigned char * genKey(int numberOfBits) {

    unsigned char *key = malloc((numberOfBits + 7) / 8);
    for (int i = 0; i < numberOfBits; i++) {

        int idx = i / 8;
        int mod = i % 8;
        unsigned char bit = (rand() & 1) << (7 - mod);

        key[idx] |= bit;
    }
    return key;
}

/* prints an array of bits.
 * Order: bitN, bitN-1, bitN-2, ...
 */
void printKey(unsigned char *key, int numberOfBits) {

    for (int i = numberOfBits - 1; i >= 0; i--) {

        int idx = i / 8;
        int mod = i % 8;
        unsigned char bit = 1 << (7 - mod);

        printf("%c", (key[idx] & bit) ? '1' : '0');
    }
    printf("\n");
}

int main() {

    srand(time(NULL));

    int bits = 56;
    unsigned char *key = genKey(bits);

    printKey(key, bits);
    free(key);

    return 0;
}