#include <stdio.h> char* print_malloc() { char* p = (char*)malloc(30); strcpy(p, "I am print_malloc"); puts(p); return p; } int main() {tt char* p; p = print_malloc();//堆空间不会随着子函数结束而释放 puts(p); return 0;这个代码有什么问题
时间: 2023-06-20 10:10:29 浏览: 89
在主函数中,tt这一行是多余的,可以删除。
在print_malloc函数中,使用了malloc动态分配内存,但没有检查是否分配成功。应该在malloc调用后加上判断语句,以确保内存分配成功。
此外,由于使用了动态分配内存,需要在使用完之后手动释放内存,否则会造成内存泄漏。可以在主函数中加上使用free函数释放p指向的内存:`free(p);`
修改后的代码如下:
```
#include <stdio.h>
#include <stdlib.h>
char* print_malloc() {
char* p = (char*)malloc(30);
if (p == NULL) {
printf("Failed to allocate memory\n");
return NULL;
}
strcpy(p, "I am print_malloc");
puts(p);
return p;
}
int main() {
char* p;
p = print_malloc();
if (p != NULL) {
puts(p);
free(p);
}
return 0;
}
```
相关问题
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<windows.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<malloc.h> typedef struct character_name { char name[100]; struct character_name* next; }char_name; typedef struct character_title { char title[100]; struct character_title* next; }char_title; typedef struct character_identity { char identity[100]; struct character_identity* next; }char_iden; typedef struct character_attribute { int strength; struct character_attribute* next; }char_att; typedef struct character_information { char_name* _name; char_title* _title; char_iden* _iden; char_att* _att; struct character_information* next; }char_inf; void initialization(char_inf*node) { node = (char_inf*)malloc(sizeof(char_inf)); node->_name = (char_name*)malloc(sizeof(char_name)); node->_title = (char_title*)malloc(sizeof(char_title)); node->_iden = (char_iden*)malloc(sizeof(char_iden)); node->_att = (char_att*)malloc(sizeof(char_att)); } char_inf* ceshi; int main() { initialization(ceshi); strcpy(ceshi->_name->name, "ceshi_1"); strcpy(ceshi->_title->title, "ceshi_2"); strcpy(ceshi->_iden->identity, "ceshi_3"); ceshi->_att->strength = 4; printf("%s\n%s\n%s\n%d\n", ceshi->_name->name, ceshi->_title->title, ceshi->_iden->identity, ceshi->_att->strength); return 0; } 为什么报错访问权限冲突
在你的代码中,报错访问权限冲突是因为你在初始化函数`initialization`中使用了错误的方式来分配内存。具体来说,你传递了一个指向`char_inf`结构体指针的指针(`char_inf* node`),然后在函数内部尝试为它分配内存。
然而,这样的分配方式是错误的,因为当你在函数内部为`node`分配内存时,它只是一个局部变量,对外部的`ceshi`指针没有影响。因此,在`main`函数中访问`ceshi`时,它仍然是一个未初始化的指针,导致访问权限冲突。
为了解决这个问题,你可以将`initialization`函数修改为返回分配好的内存块的指针,然后将其赋值给`ceshi`指针。具体代码如下所示:
```c
char_inf* initialization()
{
char_inf* node = (char_inf*)malloc(sizeof(char_inf));
node->_name = (char_name*)malloc(sizeof(char_name));
node->_title = (char_title*)malloc(sizeof(char_title));
node->_iden = (char_iden*)malloc(sizeof(char_iden));
node->_att = (char_att*)malloc(sizeof(char_att));
return node;
}
```
然后在`main`函数中调用该函数,并将返回的指针赋值给`ceshi`,如下所示:
```c
ceshi = initialization();
```
这样,你就可以正确地分配内存并访问`ceshi`结构体的成员了,不再会出现访问权限冲突的错误。
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char **argv) { char *p; int i; p=malloc(30); strcpy(p,"not 30 bytes"); printf("p=<%s>\n",p); if(argc==2) { if(strcpy(argv[1],"b")==0) p[50]='a'; else if(strcmp(argv[1],"-f")==0) { free(p); p[0]='b'; } } return 0; }
虽然在第二个if语句的else分支中加入重新分配内存的操作也可以解决问题,但是更好的解决方法是在第一个if语句的else分支中加入一个提示错误的语句,告诉用户输入的参数有误,这样可以避免对已释放的内存进行操作,同时也可以更好地保护程序的健壮性。
修改后的代码如下所示:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv) {
char* p;
int i;
p = malloc(30);
strcpy(p, "not 30 bytes");
printf("p=<%s>\n", p);
if (argc == 2) {
if (strcmp(argv[1], "b") == 0)
p[50] = 'a';
else if (strcmp(argv[1], "-f") == 0) {
free(p);
p = NULL;
}
else {
printf("Invalid argument\n");
return 1;
}
}
return 0;
}
```
在第一个if语句的else分支中加入了一个printf语句,提示用户输入的参数有误,同时当输入的参数不是"-f"时,程序会直接返回1,避免了对已释放的内存进行操作。
阅读全文