c-strdupa空指针时出现分段错误



我对指针还很陌生,void指针对我来说仍然是一门黑色艺术。在下面的代码中,当tmp->item=strdup(item(;我不知道该怎么修。

int springmap_add(SpringMap *sm, char *key, void *item) {
SpringMap *tmp = sm;
.
.
.
while (tmp) {
if (!tmp->next) {
tmp->next = springmap_init();
tmp->next->key = strdup(key);
tmp->next->item = strdup(item); // Segfault here
return 1;
}
tmp = tmp->next;
}
return 0
}

int main(int argc, char* argv[]) {
char* key[ESTS] = {"alpha"};
void* ptr[ESTS] = {(void*)0xdeadbeef};
SpringMap* map = springmap_init();

for(int i = 0; i < TESTS; i++) {
int status = springmap_add(map, key[i], ptr[i]);
}
springmap_free(map);
return 0;

我没有跟上空位指示器的速度。

函数名已经告诉:strdupstringduplicate组成,并且它只能复制以null结尾的C字符串(当然,任何数据,只要它在某个地方包含一个null字节,但除非这个null字节是数据中的最后一个字节,否则它会被过早切断(。

C中的void指针具有隐式转换为任何其他指针类型的不幸性质,这也发生在代码中。然而,这些指针并不指向以null结尾的C字符串,实际上,它们甚至根本无效(最有可能的是,至少(!因此,试图从中解读会产生未定义的行为。

因此,首先要确保您的void指针指向有效内存。要使用strdup,它们应该指向C字符串,否则memcpy是可行的,尽管您需要首先将malloc存储空间作为目标。不过,对于这两种情况,您都需要可用对象的大小。但是,不能再void指针中获取该值,因此需要另一个参数。

您可以编写自己的objdup函数来覆盖复制:

void* objdup(size_t size, void* object)
{
void* copy = malloc(size);
if(copy)
{
memcpy(copy, object, size);
}
return copy;
}

你的指针仍然需要有效!一些可能的例子可能看起来像:

int main()
{
SomeDataType o1;
AnotherDataType o2;
AnotherDatatType* ptr = &o2; // create a valid pointer
// (could be done by malloc'ing memory, too)
void* c1 = objdup(sizeof(o1), &o1);
//                            ^ take the address of a REAL object!
if(c1)
{
void* c2 = objdup(sizeof(*o2), o2); // or via pointer to REAL object
if(c2)
{
// ...
free(c2);
}
free(c1);
}
return 0;
}

相关内容

  • 没有找到相关文章

最新更新