在不使用strcpy且必须使用赋值运算符的情况下交换字符的2指针数组?
您好,我被赋予了一项任务来修复这个程序,它不会生成valgrind生成的错误日志 这是最近的代码 我怀疑这些任务在不使用strcpy且必须使用赋值运算符的情况下交换字符的2指针数组?,c,arrays,pointers,C,Arrays,Pointers,您好,我被赋予了一项任务来修复这个程序,它不会生成valgrind生成的错误日志 这是最近的代码 我怀疑这些任务 c = b; b = a; a = c; 制造问题。然而,我的老师说它不能用strcpy()来更改或替换。我正在考虑替换指针的地址,但指针已在其中声明为malloc() 有没有办法在不替换作业的情况下修改代码 注:“tukar”表示交换。删除此项: c = (char *) malloc(sizeof(char) * 50); 您不需要分配第三个缓冲区,您永远不会使用它,事实上,
c = b;
b = a;
a = c;
制造问题。然而,我的老师说它不能用strcpy()来更改或替换。我正在考虑替换指针的地址,但指针已在其中声明为malloc()
有没有办法在不替换作业的情况下修改代码
注:“tukar”表示交换。删除此项:
c = (char *) malloc(sizeof(char) * 50);
您不需要分配第三个缓冲区,您永远不会使用它,事实上,在进行交换时会覆盖它。让c
成为一个临时的char*
此外,分配可以简化为:
a = malloc(50);
b = malloc(50);
因为您不需要强制转换,sizeof(char)
始终为1
为了完整性起见,您还应该在依赖分配之前检查分配是否成功
然后,正如注释中指出的那样,删除返回值,因为这毫无意义。删除此项:
c = (char *) malloc(sizeof(char) * 50);
您不需要分配第三个缓冲区,您永远不会使用它,事实上,在进行交换时会覆盖它。让c
成为一个临时的char*
此外,分配可以简化为:
a = malloc(50);
b = malloc(50);
因为您不需要强制转换,sizeof(char)
始终为1
为了完整性起见,您还应该在依赖分配之前检查分配是否成功
然后,正如评论中指出的那样,删除返回值
,因为这毫无意义。你的老师可能在寻找的是,你指出的作业只会改变指针指向的位置,而不会制作数据的硬拷贝。有两个明显的错误:
- 当
c=b时
当指向c
的内存丢失时,会出现内存泄漏李>
- 然后,当您稍后释放
b
指向的内容时,您也会释放c
现在指向的内容
一种解决方法是永远不要为c
分配任何内存,将c
分配给与b
相同的内存,然后不要释放b
所指向的内存。你的老师可能在寻找的是,你指出的作业只会改变指针指向的位置,他们不制作数据的硬拷贝。有两个明显的错误:
- 当
c=b时
当指向c
的内存丢失时,会出现内存泄漏李>
- 然后,当您稍后释放
b
指向的内容时,您也会释放c
现在指向的内容
一种解决方法是永远不要为c
分配任何内存,将c
分配到与b
相同的内存,然后不要释放b
指向的内存。刚从朋友那里问回来。。他说返回c没有问题。他还说同样的关于c不需要malloc()-ed(感谢unwind的引用)…和关于free(a)会导致内存泄漏到c(感谢Lundin的引用)
自由(a)导致c消失,它对b的引用也受到影响。修订后的计划将被取消
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
char *tukar(){
char *a, *b, *c;
a = malloc(50);
b = malloc(50);
strcpy(a,"string a");
strcpy(b,"string b");
printf("\nBefore :\n");
printf("a = %s\n",a);
printf("b = %s\n",b);
c = b;
b = a;
a = c;
printf("\nAfter :\n");
printf("a = %s\n",a);
printf("b = %s\n",b);
free(b);
return c;
}
int main(){
char *y;
y=tukar();
printf("%s",y);
free(y);
getchar();
return 0;
}
这就是修改程序的目的。刚从朋友那里回来询问。。他说返回c没有问题。他还说同样的关于c不需要malloc()-ed(感谢unwind的引用)…和关于free(a)会导致内存泄漏到c(感谢Lundin的引用)
自由(a)导致c消失,它对b的引用也受到影响。修订后的计划将被取消
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
char *tukar(){
char *a, *b, *c;
a = malloc(50);
b = malloc(50);
strcpy(a,"string a");
strcpy(b,"string b");
printf("\nBefore :\n");
printf("a = %s\n",a);
printf("b = %s\n",b);
c = b;
b = a;
a = c;
printf("\nAfter :\n");
printf("a = %s\n",a);
printf("b = %s\n",b);
free(b);
return c;
}
int main(){
char *y;
y=tukar();
printf("%s",y);
free(y);
getchar();
return 0;
}
这就是修改程序的目标。使用c=b
将覆盖c
,因此由malloc
分配的内存将丢失。您需要一个中间变量。如何修复代码取决于您希望它做什么。例如,您希望函数返回什么值?使用c=b
您正在覆盖c
,因此由malloc
分配的内存丢失。您需要一个中间变量。如何修复代码取决于您希望它做什么。例如,您希望函数返回什么值?谢谢,我已经尝试了代码。。它还在工作。但是,如果我使用valgrind程序记录内存泄漏,错误仍然存在。。。关于这个问题,返回c
仍然是个问题,但是不清楚OP打算返回什么。谢谢,我已经尝试了这个代码。。它还在工作。但是,如果我使用valgrind程序记录内存泄漏,错误仍然存在。。。关于这个问题,返回c
仍然是一个问题,但不清楚OP打算返回什么。