【问题标题】:What is wrong with this declaration in C?C 中的这个声明有什么问题?
【发布时间】:2013-10-26 06:19:01
【问题描述】:

我定义了一个结构。

typedef struct bucket {
    char *key;
    void *value;
    struct bucket *next;
} Bucket;

此函数在名为“htable.h”的文件中定义。

int put(Table *table, const char *key, void *value) {

    Bucket insertBucket;
    strcpy(insertBucket.key, key);

    return 0;
}

这不应该有效吗?

【问题讨论】:

  • 应该的。是什么让你相信它不是?
  • 此处出现运行时错误strcpy(insertBucket.key, key);
  • char *key,Bucket的成员,需要在strcpy之前malloc'ed。
  • 您忘记复制值或设置next 字段,这两者都会给您留下一些需要解决的问题。 put() 函数真正想要做什么?值所指向的数据有多大?你怎么知道的?
  • @self。好吧,那么声明就没有问题了。这是一个语义错误。

标签: c hashtable


【解决方案1】:

问题是您没有为字符指针key 分配任何内存,而您正试图将字符串复制到它。它给你未定义的行为。
key 只是一个未初始化的字符指针,它只是指向一个随机地址。要能够使用任何指针,有两个条件:

  1. 它应该指向一个有效的内存区域&
  2. 应该保留内存供您使用(应该拥有)

你都违反了。

【讨论】:

  • -1,抱歉吹毛求疵,但字符指针不够大,无法容纳一个字符。您可以进行邪恶的强制转换并存储多达四个,但这是糟糕的代码。
  • @self.: 很公平,已修改。
  • 它是一个未初始化的指针,所以它没有指向任何有用的地方。
  • @JonathanLeffler - 你是说在strcpy(insertBucket.key, key); 行之前,做insertBucket.key=malloc(strlen(key)+1); 这样的事情不是很好吗?如果不是,为什么不呢? (还假设包括free() 在内的其他代码也将在同一块中完成)
  • @ryyker:不,他不是那个意思,他只是说明了指针使用的基本规则。如何以及在哪里(从堆栈或从堆)为指针分配内存取决于使用情况.如果可以,最好避免动态内存分配,并且仅在需要时使用它。
【解决方案2】:

您需要分配一些空间来存储您的字符串。现在你只有一个原始指针。像这样的:

char dest[80]; // arbitrary amount of space for example
strcpy(dest, key);

理想情况下,您希望在 struct 中执行此操作

typedef struct bucket {
  char key[80];
  // .. other members ..
} Bucket;

【讨论】:

  • 将数据复制到局部变量有什么帮助?或者你提议 char dest[80]; 替换结构的元素之一?
  • 更新更具体。
  • 更好...也许一个经过长度检查的副本是个好主意(但要注意strncpy() 不会以空值终止超长字符串)。
  • 或者更好,bucket->key = malloc(strlen(key) + 1); strcpy(bucket->key, key);
猜你喜欢
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 2012-08-16
  • 2023-01-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
相关资源
最近更新 更多