gpt4 book ai didi

c - strcat 的段错误

转载 作者:行者123 更新时间:2023-12-02 05:27:35 26 4
gpt4 key购买 nike

我在 strcat 和段错误方面遇到了一些问题。错误如下:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000
0x00007fff82049f1f in __strcat_chk ()
(gdb) where
#0 0x00007fff82049f1f in __strcat_chk ()
#1 0x0000000100000adf in bloom_operation (bloom=0x100100080, item=0x100000e11 "hello world", operation=1) at bloom_filter.c:81
#2 0x0000000100000c0e in bloom_insert (bloom=0x100100080, to_insert=0x100000e11 "hello world") at bloom_filter.c:99
#3 0x0000000100000ce5 in main () at test.c:6

bloom_operation如下:

int bloom_operation(bloom_filter_t *bloom, const char *item, int operation)
{
int i;

for(i = 0; i < bloom->number_of_hash_salts; i++)
{
char temp[sizeof(item) + sizeof(bloom->hash_salts[i]) + 2];
strcat(temp, item);
strcat(temp, *bloom->hash_salts[i]);

switch(operation)
{
case BLOOM_INSERT:
bloom->data[hash(temp) % bloom->buckets] = 1;
break;
case BLOOM_EXISTS:
if(!bloom->data[hash(temp) % bloom->buckets]) return 0;
break;
}
}

return 1;
}

有问题的行是第二个 strcat。 bloom->hash_salts 是结构的一部分,定义如下:

typedef unsigned const char *hash_function_salt[33];
typedef struct {
size_t buckets;
size_t number_of_hash_salts;
int bytes_per_bucket;
unsigned char *data;
hash_function_salt *hash_salts;
} bloom_filter_t;

它们在这里被初始化:

bloom_filter_t* bloom_filter_create(size_t buckets, size_t number_of_hash_salts, ...) 
{
bloom_filter_t *bloom;
va_list args;
int i;

bloom = malloc(sizeof(bloom_filter_t));
if(bloom == NULL) return NULL;

// left out stuff here for brevity...

bloom->hash_salts = calloc(bloom->number_of_hash_salts, sizeof(hash_function_salt));

va_start(args, number_of_hash_salts);

for(i = 0; i < number_of_hash_salts; ++i)
bloom->hash_salts[i] = va_arg(args, hash_function_salt);

va_end(args);

// and here...
}

bloom_filter_create 调用如下:

bloom_filter_create(100, 4, "3301cd0e145c34280951594b05a7f899", "0e7b1b108b3290906660cbcd0a3b3880", "8ad8664f1bb5d88711fd53471839d041", "7af95d27363c1b3bc8c4ccc5fcd20f32");

我做错了什么,但我真的不知道是什么。提前致谢,

本。

最佳答案

我看到了几个问题:

char temp[sizeof(item) + sizeof(bloom->hash_salts[i]) + 2];

sizeof(item) 只会返回 4(或 64 位平台上的 8)。您可能需要使用 strlen() 作为实际长度。尽管我不认为您可以像使用 strlen 那样在堆栈上声明它(尽管我认为也许我看到有人表示可以使用较新版本的 gcc - 我可能会出去吃午饭)。

另一个问题是临时数组没有初始化。所以第一个 strcat 可能不会写入数组的开头。在调用 strcat 之前,它需要在第一个元素中放入 NULL (0)。

它可能已经在被截取的代码中,但我没有看到你在结构中初始化了number_of_hash_salts成员。

关于c - strcat 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3260684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com