c - 为什么在指向字符串文字后不能成为指针 free()

标签 c

关于我的问题有一些相关的讨论,但是没有明确解释我的问题。

我认为我必须 free() 无论何时何地 malloc(),但我必须这样做,以防止内存泄漏。 所以我有以下程序:

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

int main(void)
{
    int *ptr;

    ptr = malloc(256);

    if (ptr == NULL)    {
        printf("Out of memory\n");
        return 1;
    }

    *ptr = 10;

    printf("The value of PTR is:\t%d\n",*ptr);
    free(ptr);

    return 0;
}

我有一个指针,我动态分配了一些内存 (256),然后我检查了 NULL 字母我 free() 它。

到这里一切正常:指针被动态分配了一些内存,然后我free() 它。

现在我将使用一个 char 指针,在我动态分配一些内存 (256) 之后,我将把该指针指向一个字符串文字,比方说 MICHI:

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

int main(void)
{
    char *ptr;

    ptr = malloc(256);

    if (ptr == NULL)    {
        printf("Out of memory\n");
        return 1;
    }

    ptr = "michi";
    printf("%s",ptr);

    free(ptr);

    return 0;
}

这里我做错了,因为如果我尝试 free() 它,那么它不会工作,因为碰巧我要释放一个非堆对象。

所以我在这里迷路了,因为我认为你必须 malloc() 的所有内容都必须 free() 它。 究竟是什么使该指针在指向字符串文字后不需要被 free()ed

最佳答案

ptr = malloc(256);
...
ptr = "michi";
printf("%s",ptr);
free(ptr);

当您将内存分配给 ptr,然后使其指向 string literal。因此指针 ptr 不再指向由 malloc 分配的内存。

free 不是由 malloc 或类似函数分配的内存会导致程序出错。

改为这样做:

strcpy(ptr,"michi");

关于c - 为什么在指向字符串文字后不能成为指针 free(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32144812/

相关文章:

c++ - 尝试使用 LoadLibrary 加载 DLL 并获取 R6034 "An application has made an attempt to load the C runtime library incorrectly"

c - 在c中用typedef声明函数时,我们如何消除未声明的函数错误?

c - 在 C 中将值发送到声音驱动程序(const void)

c - 是否可以在 C 代码中使用 log4cplus?

c - 没有锁的一插入多读列表安全吗?

c++ - xgettext - 提取可翻译字符串并更新 .pot

objective-c - 如何附加到 C 数组的末尾

c++ - 事务模式下的SQLite字符串管理

C 程序无法读取 .txt 文件中的用户名和密码

c - 语法错误