为什么在指向字符串文字后不能成为空指针()?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

我无论怎么使用malloc(),必须使用free()以防止内存泄漏。所以我有以下程序:

#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()

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

#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(),那么它不会工作,因为它发生在我要释放一个非堆对象。

提问于
用户回答回答于

在第一个程序中分配了内存

ptr = malloc(256);

sizeof( int )用整数值10 初始化其第一个字节。

*ptr = 10;

指针本身没有改变。所以在这个声明中

free(ptr);

指针ptr指向使用malloc分配的内存。

在第二个程序中,照与第一个程序中相同的方式分配内存

ptr = malloc(256);

但是,你重新分配了指针本身的字符串文字“michi”的第一个字符的地址

ptr = "michi";

比较此作业的左侧

*ptr = 10;

和这项任务

ptr = "michi";

他们是不同的。在第一种情况下,正在更改分配的内存,而在第二种情况下,正在更改指针本身。

因此在这个声明中

free(ptr);

指针ptr不指向先前分配的内存。它指向未使用malloc分配的字符串文本占用的内存。

因此,这种说法是错误的,程序有内存泄漏,因为之前使用malloc分配的内存没有被释放,

用户回答回答于
 ptr = malloc(256);
 ...
 ptr = "michi";
 printf("%s",ptr);
 free(ptr);

当你分配内存ptr,然后你指向它string literal。因此指针ptr不再指向由内存分配的内存malloc

而对于free没有分配的内存malloc或类似的功能会导致程序错误。

 strcpy(ptr,"michi");

扫码关注云+社区

领取腾讯云代金券