我生成一个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;
}
我无法编译它。我不明白为什么。
答案 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;
}
此处key
是bool*
,但您尝试返回*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
。
读者留下的剩余问题:
错误处理。
你不能printf
指向布尔数组的指针并期望得到明智的结果。
使用bool
数组不是存储位域的有效方法;不可否认,它是可读的,对于64字节,人们可能会说“谁在乎?”
答案 4 :(得分:0)
您的代码中存在许多问题。除了别人所说的,你要为数组赋值
char truc[64] = genkey();
在C中被禁止。数组只能通过{ }
对中的值进行初始化。这就是程序没有编译的原因
更糟糕的是,函数的返回值是数组中的一个字节,而不是地址。即使它是地址,您也将面临未定义的行为,因为它是一个本地数组,在退出范围后结束其生命。此外,您在程序中生成8个字节,然后期望它在main
错误列表仍未结束。你不用包括“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;
}