嘗試連接兩個使用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("%s
", John)。)
return 0。
}
uj5u.com熱心網友回復:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char* John = malloc(11); // This should hold enough space: 10 1 for ''/span>.
char* Carter = malloc(7)。
strcpy(John, "John") 。
strcpy(Carter, "Carter") 。
strcat(John, Carter);
printf("%s
", John)。)
//完成后釋放記憶體。
free(John)。
free(Carter)。
}
輸出:
JohnCarter
uj5u.com熱心網友回復:
字串字面意義是什么?
"John "告訴編譯器將for字母和一個零位元組存盤在某個地方,最好是在只讀記憶體中,并給你一個指向該記憶體的指標。那么你做了什么:- 你分配了一個指向記憶體的指標。
- 你分配了一個指向 4 位元組的指標。對于字串 "John "來說是不夠的,它需要五個位元組。你將這個指標存盤在變數John中。
- 你將5個位元組的 "John "存盤在只讀存盤器中,取得了一個指向該存盤器的指標,并將該指標存盤在變數John中,覆寫了先前的指標。
- 你呼叫了strcat,它試圖將 "Carter "復制到只讀存盤器中 "John "的末尾。由于它是只讀記憶體,它崩潰了。如果它沒有崩潰,它就會在某處寫下7個位元組到記憶體中,而這7個位元組被用來做其他事情。那會更糟。
uj5u.com熱心網友回復:
首先,這個程式產生了記憶體泄漏,因為一開始,一個記憶體是動態分配的
char* John = malloc(4)。
char* Carter = malloc(7)。
它的地址被分配給指標John和Carter,然后這些指標被重新分配為字串字面的第一個字符地址。
John = "John"/span>。
Carter = "Carter"。
所以分配的記憶體的地址就丟失了。
此外,指標John應指向一個足夠大的記憶體來存盤串聯的結果字串。
該程式可以看起來像以下的方式
int main(void)
{
char *John = malloc(12)。
strcpy( John, "John" ) 。
const char *Carter = "Carter"/span>;
strcat( John, Carter );
printf("%s
", John)。)
free( John )。
return 0;
它的輸出是
。John Carter
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/306945.html
標籤:
下一篇:用于雙環境構建的CMake設定
