函數接收 char *mallo(已 malloc),內部賦值方式成敗:
mallo = "bag"; —— 只修改局部指針副本,外部不見變化。*(mallo++) = ... 或 mallo[i] = ... —— 寫入指向的內存。strcpy(mallo, "bag"); —— 庫函數逐字符拷貝含 \0。mallo 是副本,指向同一堆塊。mallo = "literal" 讓副本指向常量區,脫離原堆塊。*mallo 或下標 mallo[i] 才能寫入原堆塊。[cpp]
#include
#include
#include
void memtest(char *mallo) {
// 逐字符賦值
for (int i = 0; i < 36; i++) mallo[i] = 'a' + rand() % 26;
// 或 strcpy(mallo, "bag");
// 切勿 mallo = "bag";
printf("函數內:%s\n", mallo);
}
int main() {
char *mallo = malloc(36);
if (!mallo) { printf("malloc failed\n"); return 1; }
memtest(mallo);
printf("主函數:%s\n", mallo); // 可見修改
free(mallo);
return 0;
}
strcpy 需 #include ,否則隱式聲明可能導致錯誤。free 釋放堆內存。