将下面的错误代码改成正确的代码#include <stdio.h> #include <stdlib.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[0]='b'; } } /free(p);/ return 0; }
时间: 2024-01-23 09:04:25 浏览: 76
下面是修改后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {
char *p;
int i;
p = malloc(30);
strncpy(p, "not 30 bytes", 29); // 使用 strncpy 函数来避免越界
p[29] = '\0'; // 手动添加字符串结束符
printf("p=<%s>\n", p);
if (argc == 2) {
if (strcmp(argv[1], "-b") == 0 && strlen(p) > 50) // 添加字符串长度判断
p[50] = 'a';
else if (strcmp(argv[1], "-f") == 0) {
free(p);
p = NULL; // 释放指针后手动设置为 NULL
}
}
if (p != NULL) // 判断指针是否非空后再释放
free(p);
return 0;
}
```
修改说明:
1. 在使用 malloc 分配内存时,应该为指针分配的大小加上字符串结束符 '\0' 的大小。
2. 在使用 strcpy 函数时,应该使用 strncpy 函数,并指定拷贝的长度,避免越界。
3. 在使用指针之前应该先判断指针是否为 NULL,避免野指针错误。
4. 在使用 free 释放指针后,应该手动将指针设置为 NULL,避免重复释放。
5. 在访问指针之前应该先判断指针是否为 NULL,避免野指针错误。
希望以上修改能够帮助您解决问题。
阅读全文