代码注释包含malloc,free,realloc,memset,strcpy原型用法
三种指针指向字符串方法:
1. p="abandon";//将字符串"abandon"存储到指针变量p所指向的内存空间
puts(p);
//
2. char p[] = "hello";
printf("%s", p); // 输出 "hello"
//
3. strcpy(p, "world"); // 将字符串 "world" 复制到 p 所指向的内存空间中
printf("%s", p); // 输出 "world"
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//malloc,free,memset,realloc,strcopy基本用法
int main()
{
char *p;
char *pp;
//malloc: 原型:(void *)malloc(size_t size);
//头名件加上:#include <stdlib.h>
//分配一个整数:int *ptr = (int *)malloc(sizeof(int));
p = (char *)malloc(10);//50改为10出现错误
/*
在这段代码中,出现了内存越界访问错误(segmentation fault)。
具体来说,当将字符串 "abandon" 赋值给 p 时,由于字符串的长度为 7,
而分配给它的内存空间只有 10 个字节,因此会导致内存越界访问错误。
这是因为在 C 语言中,字符串是以字符数组的形式存储的,
每个字符占用一个字节的空间。因此,如果要将一个字符串赋值给一个指针变量,
需要确保该指针变量所指向的内存空间足够大,以容纳整个字符串。
另外,在将单个字符 'c' 赋值给 pp 时,也会出现类似的问题。
因为 pp 所指向的内存空间只有一个字节的大小,无法容纳一个字符。
*/
if(p == NULL){
printf("malloc erro\n");
exit(-1);
}//这段代码的作用是检查指针 p 是否为空,如果为空则输出错误信息并退出程序。
pp = (char *)malloc(1);
if(pp == NULL){
printf("malloc erro\n");
exit(-1);
}
memset(pp,'\0',20);// memset() 函数将 pp 所指向的内存空间初始化为空字符('\0')
//原型: void *memset(void *buffer, int c, int count);
//其中,buffer 为指针或是数组,c 是赋给 buffer 的值,count 是 buffer 的长度。
//这个函数在 socket 中多用于清空数组。
printf("扩容地址:%x \n",pp);
int len = strlen("abandon246541565149862");
int newlen = len-20+1;
realloc(pp,newlen);
//realloc原型: void *realloc(void *mem_address, unsigned int newsize);
//mem_address 是指针或是数组,newsize 是需要改变的内存大小。
printf("扩容后地址:%x \n",pp);
p="abandon";//传字符串
puts(p);
*pp='c';//传单个字符
puts(pp);
strcpy(pp,"abandon246541565149862");
//char *strcpy(char *strDest, const char *strSrc);
//其中,strDest是目的字符串,strSrc是源字符串。将后复制到前
puts(pp);
free(pp);//释放新的内存空间
free(p);
//void free(void *ptr);
//ptr是指向要释放的内存块的指针。
/*三种方法将字符串给指针
p="abandon";//将字符串"abandon"存储到指针变量p所指向的内存空间
puts(p);
//
char p[] = "hello";
printf("%s", p); // 输出 "hello"
//
strcpy(p, "world"); // 将字符串 "world" 复制到 p 所指向的内存空间中
printf("%s", p); // 输出 "world"
*/
return 0;
}
结果: