在两个用malloc()分配然后用=分配的字符串上使用strcat()会导致C程序中的段错误



试图连接使用malloc分配的两个字符串似乎不起作用,但如果变量更改为John[4]Carter[6],那么它有效吗?

除了将变量更改为"数组"之外,还有其他选择吗?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char* John = malloc(4);
char* Carter = malloc(7);
John = "John";
Carter = "Carter";
strcat(John, Carter);
printf("%sn", John);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char* John = malloc(11); // This should hold enough space: 10 + 1 for ''
char* Carter = malloc(7);

strcpy(John, "John");
strcpy(Carter, "Carter");

strcat(John, Carter);
printf("%sn", John);

// Release memory when done
free(John);
free(Carter);
}

输出:

JohnCarter

字符串字面量是什么意思?

" John "告诉编译器把for字母和一个0字节存储在某个地方,最好是在只读内存中,并给你一个指向该内存的指针。你都做了些什么呢?

  1. 你分配了一个4字节的指针。对于字符串" John "来说还不够,它需要5个字节。指针存储在变量John中。
  2. 你在只读内存中存储了5个字节的"John",获取了一个指向该内存的指针,并将该指针存储在变量John中,覆盖了之前的指针。
  3. 您调用了strcat,它试图将"Carter"复制到只读内存中的"John"末尾。因为它是只读内存,所以会崩溃。如果它没有崩溃,它将在内存的某个地方写入7个字节,这些字节将用于其他事情。那会更糟。

首先,程序会产生内存泄漏,因为一开始内存是动态分配的

char* John = malloc(4);
char* Carter = malloc(7);

和它的地址被分配给指针JohnCarter,然后这些指针被重新分配为字符串字面量的第一个字符的地址。

John = "John";
Carter = "Carter";

所以分配的内存地址会丢失。

而且,指针John应该指向足够大的内存来存储连接后的结果字符串。

程序可以按照如下方式执行

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) 
{
char *John = malloc(12);
strcpy( John, "John " );
const char *Carter = "Carter";
strcat( John, Carter );

printf("%sn", John);
free( John );

return 0;
}

输出为

John Carter

最新更新