将realloc与char* 一起使用[重复]

0x6upsns  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(145)

此问题在此处已有答案

Proper way to copy C strings(4个答案)
2天前关闭.

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

int main()
{
    
    char *cp;
    
    cp = (char *)malloc(10 * sizeof(char));
    cp="kerem";
    //strcpy(cp, "kerem");
    printf("%s",cp);
    cp=(char *)realloc(cp,30 * sizeof(char));
    //strcpy(cp, "kerem demir Aziz Kerem Demir");
    cp= "kerem demir Aziz Kerem Demir";
    printf("%s",cp);
    //free(cp);
 
   return 0;
}

在使用strcpy函数时,我可以复制指针字符串而没有任何问题,但是;当我使用char * 执行此操作时,我得到以下错误:realloc():无效指针

y0u0uwnf

y0u0uwnf1#

这段代码有几个问题:

  • 看起来您希望cp="kerem";将数据复制到cp所指向的位置,而实际上它只是使cp指向字符串文字“kerem”的位置
  • 记住第一点,您将在指向字符串文字的指针上调用realloc,这是不允许的
  • 即使我们忽略前两个,cp的新大小也将是20,这不足以存储您试图复制的值(即使假设您使用strcpy而不是=)。
fjnneemd

fjnneemd2#

关键的问题是台词:

cp="kerem";

C语言中的字符串字面量或多或少(*)是这样工作的:

static char _unnamed_[] = "kerem";
cp = _unnamed_;

现在,cp指向一个内存,该内存 * 不是 * 通过malloc/realloc从动态分配中产生的,并且在不调用Undefined Behavior的情况下,它不能成为realloc的参数。
这就是为什么需要strcpy,因为它将内存的内容复制到cp所指向的另一个内存中,指针cp的值不变。
(*)不能修改字符串文字,而且具有相同内容的文字 * 可以 * 共享存储。

相关问题