Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不使用strcpy且必须使用赋值运算符的情况下交换字符的2指针数组?_C_Arrays_Pointers - Fatal编程技术网

在不使用strcpy且必须使用赋值运算符的情况下交换字符的2指针数组?

在不使用strcpy且必须使用赋值运算符的情况下交换字符的2指针数组?,c,arrays,pointers,C,Arrays,Pointers,您好,我被赋予了一项任务来修复这个程序,它不会生成valgrind生成的错误日志 这是最近的代码 我怀疑这些任务 c = b; b = a; a = c; 制造问题。然而,我的老师说它不能用strcpy()来更改或替换。我正在考虑替换指针的地址,但指针已在其中声明为malloc() 有没有办法在不替换作业的情况下修改代码 注:“tukar”表示交换。删除此项: c = (char *) malloc(sizeof(char) * 50); 您不需要分配第三个缓冲区,您永远不会使用它,事实上,

您好,我被赋予了一项任务来修复这个程序,它不会生成valgrind生成的错误日志

这是最近的代码

我怀疑这些任务

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打算返回什么。