初学C语言笔记221005

时间:2022-10-05 16:56:33

realloc 调整动态内存开辟空间的大小

int* p1 = (int*)malloc(10 * sizeof(int));

if (p1 == NULL)
{
printf("%s", strerror(errno));
}
else
{
*p1 = 0x12345678;
*(p1 + 1) = 0x789;
}
free(p1);
p1 = NULL;

初学C语言笔记221005


int *p1 = realloc(NULL,40); //可以当作malloc(40);使用

要避免:
对NULL进行解引用操作,
对动态开辟内存的越界访问
对非动态开辟的内存空间释放
使用free释放动态内存的一部分
对同一块动态内存多次释放
动态内存忘记释放(内存泄漏)

又是考题: 

初学C语言笔记221005

初学C语言笔记221005

//第一种改正方式
void GetMemory(char **p)
{
*p = (char*)malloc(100);
}
void Test()
{
char *str = NULL;
GetMemory(&str);
strcpy(str,"Hello World");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
//第二种改正方式
char* GetMemory(char *p)
{
p = (char*)malloc(100);
return p;
}
void Test()
{
char *str = NULL;
str = GetMemory(str);
strcpy(str,"Hello World");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}

又来一题:

初学C语言笔记221005

返回栈空间地址

非法访问已出栈地址,VS:打印随机值

又来一题:

初学C语言笔记221005

非法访问,但是输出world. 初学C语言笔记221005


初学C语言笔记221005

初学C语言笔记221005

柔性数组:

初学C语言笔记221005

struct S* ps = (struct S*)malloc( sizeof(struct S)+5*sizeof(int) );
ps->n = 100; //
int i = 0;
for(i = 0; i < 5; i++)
{
ps->arr[i] = i;
}
struct S* ps2 = realloc(ps,44);
free(p1);
free(p2);