【问题标题】:Void pointers and dynamic memory allocation空指针和动态内存分配
【发布时间】:2021-01-09 05:19:39
【问题描述】:

我正在尝试制作一个单词计数器程序,它需要一个句子并计算单词的数量。我想使用动态内存分配,因为它有许多优点,例如不必担心空间不足或空余空间过多。到目前为止,这是我的代码:

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

const char *strmalloc(const char *string);
char *user_input = NULL;

int main(void) {
    printf("Enter a sentence to find out the number of words: ");
    strmalloc(user_input);
    return 0;
}

const char *strmalloc(const char *string) {
    char *tmp = NULL;
    size_t size = 0, index = 0;
    int ch;

    while ((ch = getchar()) != '\n' && ch != EOF) {
        if (size <= index) {
            size += 1;
            tmp = realloc((char*)string, size);
        }
    }
}

您可能知道,realloc 函数的原型是这样的:

void *realloc(void *ptr, size_t size)

当我在 strmalloc() 函数的 while 循环中使用 realloc 函数时,我收到一条警告:

Passing 'const char *' to parameter of type 'void *' discards qualifiers

我不知道这意味着什么,但我知道我可以通过对char* 的类型转换来摆脱它

但是,我了解到我不应该仅仅为了防止警告而使用类型转换。我应该了解警告警告我的内容,并确定类型转换是否正确。但话又说回来,我知道指向 void 的指针可以接受任何数据类型,并且要指定一个,需要进行类型转换。所以我的问题是,我应该将类型转换保留在 realloc() 函数中还是去掉它并做其他事情。

【问题讨论】:

  • A qualifier 是修改类型的关键字,例如 volatileconst。这有帮助吗?
  • @JohnKugelman 感谢您回答问题的那一部分,但我的主要问题仍未得到解答。如果你知道答案,请告诉我。谢谢!
  • 它将引导您找到正确的答案。你想避免抛弃警告是正确的。有比抛弃const更好的解决方案。
  • @JohnKugelman,对不起,我想我不明白。你能告诉我你在做什么吗?
  • Do not cast away a const qualification. remove_spaces 示例与您的代码非常相似。

标签: c memory-management


【解决方案1】:

const 是一个类型限定符。在C 以及可能在许多其他编程语言中,const 应用于数据类型表示该数据是只读的。

将“const char *”传递给“void *”类型的参数会丢弃限定符

您收到上述错误是因为您将const 对象传递给不是const 的参数(realloc 中的(void *)),并警告您可能会更改(丢弃) const char* string 使用 void* ptr 指向的值,这违背了将数据声明为 const 的整个目的。

但是看这个例子,你试图为char* string分配一个内存,并且在分配之后,你想在那个内存中写一些东西,如果你把它写成const,它怎么写。

所以你不需要你的char* stringconst,因此不需要在realloc 中转换为char*

【讨论】:

  • 感谢@IrAM,您无法更改const char *string 值是对的。我不知道我在想什么。不过谢谢!
猜你喜欢
  • 2019-07-12
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 2015-06-19
  • 2019-06-24
  • 2013-10-04
相关资源
最近更新 更多