如何在函数中使用 realloc() 并访问值?

How to use realloc() in a function and access the values?

我知道这个问题已经得到回答,但我还有一些问题,我已经阅读了将指针传递给指针的其他答案,但我不知道如何访问这些值或存储它们。

代码也给出错误分段错误(核心已转储)

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

void secValue(char **);

void main(){
    char *pointer=(char *)malloc(2*sizeof(char));
    char a;
    int i;
    printf("Enter 1st value \n");
    scanf(" %c",&pointer[0]);
    secValue(&pointer);

    //Display
    for(i=0;i<=3;i++){
        printf(" %c\n", pointer[i]);
    }
}

void secValue(char **pointera){
    printf("First value is %c \n",*pointera[0]);

    printf("Enter 2nd value\n");
    scanf(" %c",&pointera[1]);

    printf("Enter 3rd and 4th value\n");
    *pointera=(char *)realloc(*pointera,3*sizeof(char));
    scanf(" %c %c",&pointera[2],&*pointera[3]);
} 

您需要使用 &((*pointera)[1]) 而不是 &pointera[1] 因为第二个表达式是指针数组中第二个指针的地址,而不是嵌套指针地址的地址。由于运算符优先级,我们必须使用括号。

我还包括了次要代码修复,例如删除冗余指针转换。 C 语言允许从 void * 到其他指针类型的隐式转换。

您还必须更正 realloc() 函数调用中的参数。您访问第三个数组索引,因此数组长度必须至少为 4。

您还必须在通过 scanf() 函数读取每个字符后插入 getchar() 调用,因为 scanf() 在标准输入中留下 \n 字符,并且下一次调用 scanf() 时使用 % c 格式将读取换行符而不是您键入的字符。

这是你的全部代码(已修复),我尽量不更改逻辑甚至名称 :P

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

void secValue(char **);

int main() {
    char *pointer = malloc(2 * sizeof(char));
    char a;
    int i;
    printf("Enter 1st value \n");
    scanf("%c", &pointer[0]);
    getchar();
    secValue(&pointer);

    for(i = 0; i <= 3;i++) {
        printf("%c\n", pointer[i]);
    }
}

void secValue(char **pointera) {
    printf("First value is %c\n", (*pointera)[0]);

    printf("Enter 2nd value\n");
    scanf("%c", &((*pointera)[1]));
    getchar();

    printf("Enter 3rd and 4th value\n");
    *pointera = realloc(*pointera, 4 * sizeof(char));
    scanf("%c %c", &((*pointera)[2]), &((*pointera)[3]));
}

干杯,gjm

这个表达式

*pointera[0]

等同于

*( pointera[0] )

并生成 char 类型对象的值。

你可以像这样重写表达式

( *pointera )[0]

但是这个特殊情况的结果是相同的,因为 pointera[0]*pointera 是等价的表达式。你甚至可以写 pointera[0][0] of **pointera.

这是一个演示程序。

#include <stdio.h>


int main(void) 
{
    char c = 'A';
    char *p = &c;
    char **q = &p;

    printf( "c = %c\n", *q[0] );
    printf( "c = %c\n", ( *q )[0] );
    printf( "c = %c\n", q[0][0] );
    printf( "c = %c\n", **q );

    return 0;
}

它的输出是

c = A
c = A
c = A
c = A

然而,当您试图访问指针指向的单个对象时,这些关系是有效的。

当一个指针指向一个指向数组第一个元素的指针时,最好使用下面的记录

( *pointera )[i]

其中 i 是所需元素的索引。这条记录说的是第二个指针( *pointera )指向数组第一个元素的代码reader

因此,为了使您的函数 secValue 更具可读性,我建议替换此语句中的表达式

printf("First value is %c \n",*pointera[0]);

以下

printf("First value is %c \n", ( *pointera )[0]);

至于这个说法

scanf(" %c",&pointera[1]);

那么使用的表达式已经无效了。指针 pointera 指向单个对象(另一个指针),因此表达式 pointera[1] 指向单个对象之外的对象。你必须写

scanf(" %c", *pointera + 1 );

scanf(" %c", &( *pointera )[1] );

同样适用于此声明

scanf(" %c %c",&pointera[2],&*pointera[3]);

应该有

scanf(" %c %c", *pointera + 2, *pointera + 3 );

scanf(" %c %c",&( *pointera )[2],&( *pointera )[3]);

好像是这个说法

*pointera=(char *)realloc(*pointera,3*sizeof(char));

有错字。你是说

*pointera=(char *)realloc(*pointera, 4 * sizeof(char));
                                    ^^^

另外最好使用一个中间变量来重新分配内存,因为realloc可以return NULL并且原来的指针pointera会被[=37覆盖=].

所以函数看起来像

void secValue(char **pointera){
    printf("First value is %c \n", ( *pointera )[0]);

    printf("Enter 2nd value\n");
    scanf(" %c", *pointera + 1 );

    printf("Enter 3rd and 4th value\n");

    char *tmp = realloc(*pointera, 4 * sizeof(char)); 

    if ( tmp != NULL )
    {
        *pointera = tmp 
        scanf(" %c %c",*pointera + 2, *pointera + 3 );
    }
}