试图连接使用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字节存储在某个地方,最好是在只读内存中,并给你一个指向该内存的指针。你都做了些什么呢?
- 你分配了一个4字节的指针。对于字符串" John "来说还不够,它需要5个字节。指针存储在变量John中。
- 你在只读内存中存储了5个字节的"John",获取了一个指向该内存的指针,并将该指针存储在变量John中,覆盖了之前的指针。
- 您调用了strcat,它试图将"Carter"复制到只读内存中的"John"末尾。因为它是只读内存,所以会崩溃。如果它没有崩溃,它将在内存的某个地方写入7个字节,这些字节将用于其他事情。那会更糟。
首先,程序会产生内存泄漏,因为一开始内存是动态分配的
char* John = malloc(4);
char* Carter = malloc(7);
和它的地址被分配给指针John
和Carter
,然后这些指针被重新分配为字符串字面量的第一个字符的地址。
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