微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

空指针和动态内存分配

如何解决空指针和动态内存分配

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

#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() 函数中保留类型转换还是去掉它并做其他事情。

解决方法

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

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

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

但是看看这个例子,你试图为 char* string 分配一块内存,分配之后,你想往内存中写入一些东西,如果你让它const,那么怎么期望写吧。

因此您不需要将 char* string 设为 const,因此,无需在 char* 中强制转换为 realloc

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。