当前位置: 首页 > 知识库问答 >
问题:

C - 传递和操作字符指针和指针到指针

端木澄邈
2023-03-14

作为C语言的新手,我正在使用指针,特别是双指针。

我的意图是

  1. 中的 malloc 字符指针
  2. 将错误定位的指针传递给不同的函数
  3. 获取同一指针内每个函数的结果
  4. 释放主中的指针

这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void process1(char **pointer) {
    //this should take and change the pointer value from a to x
    (*pointer)[0] = 'x';
    (*pointer)[1] = '\0';
}

void process2(char **pointer) {
    //this should take the pointer, free and NULL it, do a new malloc and set the pointer value to y
    char* p = *pointer;
    free(p);
    p = NULL;

    p = malloc(sizeof(char)*2);
    p[0] = 'y';
    p[1] = '\0';

    *pointer = p;
}

void main() {
    char* p = malloc(sizeof(char)*2);
    p[0] = 'a';
    p[1] = '\0';
    //should print a
    printf("%s\n",p);
    process1(&p);
    //should print x
    printf("%s\n",p);
    process2(&p);
    //should print y
    printf("%s\n",p);

    free(p);
    p=NULL;

}

//this is the Output as expectd
sh-4.2$ main
a
x
y

我现在的问题是:

  1. 这是好的做法吗?
  2. 错误
  3. 定位 p 指针时,我是否在函数进程 2 中泄漏了内存?我需要在某个地方释放这个 p 指针吗?

共有3个答案

赖渊
2023-03-14

>

  • 释放函数中的内存不是一个好主意,除非您 100% 确定传递的指针已错误定位。否则,如果您忘记它并传递任何其他指针,则非常容易出错。

    您的职能

    void process1(char **pointer) {
        //this should take and change the pointer value from a to x
        (*pointer)[0] = 'x';
        (*pointer)[1] = '\0';
    }
    

    不需要字符**参数

    void process1(char *pointer) {
        //this should take and change the pointer value from a to x
        pointer[0] = 'x';   // or *pointer = 'x';          or *pointer++ = 'x';
        pointer[1] = '\0';  // or *(pointer + 1) = '\0';   or *pointer = '\0';
    }
    

  • 弘承运
    2023-03-14
    1. 这是好的做法吗?

    >

  • 当您不知道在编译时将收到多少输入数据时,动态内存非常有用。您可以轻松地重新分配动态数组的大小,而不能修改堆栈上数组的大小。

    最大的缺点是内存泄漏和可能的分段错误。

    您必须释放分配的内存。

    在自动存储上声明的阵列更易于使用且速度更快

    在您的情况下,无需传递指针到指针,只需使用

    void process1(char *pointer) {
        pointer[0] = 'x';
    
    process1(p);
    

    在 process2 中,您可以使用 realloc() 而不是释放和分配新内存。以免建议指针字符*

    pointer = realloc (pointer, 4 * sizeof(int));
    
    • 您不会丢失已存储在指针数组中的数据

    不,没有任何内存泄漏或超出界限。

    如果您正在使用指针,最好使用名为 valgrind 的工具调试程序。

    如果不必使用动态分配,请不要使用。它容易出错,速度较慢,您必须释放数据。

  • 朱锐
    2023-03-14

    这个程序表现良好。它正确地释放所有分配的内存,并且不会超出分配的内存范围进行写入。

    从重新分配以前分配的内存的角度来看,process2 正在做什么是可以的。在这种特殊情况下,您分配的内存量与以前相同,但一般来说,如果这样的函数可能正在扩展分配的内存,那么传递双指针来修改调用函数中的指针变量是有意义的。

    至于 process1,通过地址传入的指针没有被修改,只是它指向什么,所以这里不需要双指针。您可以将其定义为:

    void process1(char *pointer) {
        pointer[0] = 'x';
        pointer[1] = '\0';
    }
    

    并像这样称呼它:

    process1(p);
    
     类似资料:
    • 指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位编译器指针大小为4字节,64位编译器指针大小为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。 int a = 100; int *p; p = a; //把a的值赋值给指针变量p

    • 我正在学习链表,以及如何在C中使用结构和指针创建链表。下面我举一个例子。据我所知,被调用的将头节点所在的结构的开始内存位置作为参数传递。push()函数的参数将结构节点作为指向指针的指针,因此它作为引用传递,而不是实际副本。因此,我们的的第一个指针只是指向头部节点的内存位置的指针,第二个指针指向该值,该值是头部节点指向的下一个内存位置。我们通过为结构节点分配一些内存,在结构节点内创建一个名为new

    • C++ 运算符 C++ 提供了两种指针运算符,一种是取地址运算符 &,一种是间接寻址运算符 *。 指针是一个包含了另一个变量地址的变量,您可以把一个包含了另一个变量地址的变量说成是"指向"另一个变量。变量可以是任意的数据类型,包括对象、结构或者指针。 取地址运算符 & & 是一元运算符,返回操作数的内存地址。例如,如果 var 是一个整型变量,则 &var 是它的地址。该运算符与其他一元运算符具有

    • 主要内容:到底使用字符数组还是字符串常量C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《 C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: 运行结果: https://www.xnip.cn https://www.xnip.cn 字符数组归根结底还是一个数组,上节讲到的关于 指针和数组的规则同样也适用于字符数组。更改上面的代码,使用指针的方式来输出字符串: 运行结果: https://ww

    • 指针概述 指针的概念 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,例如int型占4个内存单元,char型占1个内存单元。为了正确地访问这些内存单元,必须为每个内存单元编上号,根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地

    • C++ 指针 C++ 允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值: #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {

    • 我正在写作业,想知道这实际上是什么定义:

    • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p