C 字符指针 with/without malloc
C char pointer with/without malloc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
const char *str = "This is a string";
char *strCpy = strdup(str); // new copy with malloc in background
printf("str: %s strCpy: %s\n", str, strCpy);
free(strCpy);
char *anotherStr = "This is another string";
printf("anotherStr: %s\n", anotherStr);
char *dynamicStr = malloc(sizeof(char) * 32);
memcpy(dynamicStr, "test", 4+1); // length + '[=11=]'
printf("dynamicStr: %s\n", dynamicStr);
free(dynamicStr);
return 0;
}
为什么anotherStr
的定义不用malloc也可以,anotherStr
和dynamicStr
有什么区别?
这是可能的,因为这里:
char *anotherStr = "This is another string";
字符串字面值("This is another string")被分配到别处,
anotherStr
只是设置为指向内存中的那个区域。例如,您不能更改此字符串。更多here
这里:
char *dynamicStr = malloc(sizeof(char) * 32);
memcpy(dynamicStr, "test", 4);
在某处分配给定大小的内存并返回指向它的指针
分配给 dynamicStr
。然后使用 memcpy
写入该位置。与前面的示例相反,您可以在此位置 write/modify 内容。但是您需要稍后释放此内存。
ps。在上面的示例中,您在打印时触发了未定义的行为,因为您使用 memcpy
进行复制并复制了 4 个字符 - 并且也忘记了复制空终止符。请改用 strcpy
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
const char *str = "This is a string";
char *strCpy = strdup(str); // new copy with malloc in background
printf("str: %s strCpy: %s\n", str, strCpy);
free(strCpy);
char *anotherStr = "This is another string";
printf("anotherStr: %s\n", anotherStr);
char *dynamicStr = malloc(sizeof(char) * 32);
memcpy(dynamicStr, "test", 4+1); // length + '[=11=]'
printf("dynamicStr: %s\n", dynamicStr);
free(dynamicStr);
return 0;
}
为什么anotherStr
的定义不用malloc也可以,anotherStr
和dynamicStr
有什么区别?
这是可能的,因为这里:
char *anotherStr = "This is another string";
字符串字面值("This is another string")被分配到别处,
anotherStr
只是设置为指向内存中的那个区域。例如,您不能更改此字符串。更多here
这里:
char *dynamicStr = malloc(sizeof(char) * 32);
memcpy(dynamicStr, "test", 4);
在某处分配给定大小的内存并返回指向它的指针
分配给 dynamicStr
。然后使用 memcpy
写入该位置。与前面的示例相反,您可以在此位置 write/modify 内容。但是您需要稍后释放此内存。
ps。在上面的示例中,您在打印时触发了未定义的行为,因为您使用 memcpy
进行复制并复制了 4 个字符 - 并且也忘记了复制空终止符。请改用 strcpy
。