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



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

代码还给出了错误分段错误(核心转储)

#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(" %cn", pointer[i]);
}
}
void secValue(char **pointera){
printf("First value is %c n",*pointera[0]);
printf("Enter 2nd valuen");
scanf(" %c",&pointera[1]);
printf("Enter 3rd and 4th valuen");
*pointera=(char *)realloc(*pointera,3*sizeof(char));
scanf(" %c %c",&pointera[2],&*pointera[3]);
} 

此表达式

*pointera[0]

相当于

*( pointera[0] )

并生成 char 类型的对象的值。

你可以重写表达式,比如

( *pointera )[0]

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

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
char c = 'A';
char *p = &c;
char **q = &p;
printf( "c = %cn", *q[0] );
printf( "c = %cn", ( *q )[0] );
printf( "c = %cn", q[0][0] );
printf( "c = %cn", **q );
return 0;
}

它的输出是

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

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

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

( *pointera )[i]

其中i是所需元素的索引。此记录表示第二个指针( *pointera )指向数组的第一个元素的代码读取器。

因此,为了使您的函数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因为可以返回NULL,并且原始指针pointera将被NULL覆盖。

所以函数看起来像

void secValue(char **pointera){
printf("First value is %c n", ( *pointera )[0]);
printf("Enter 2nd valuen");
scanf(" %c", *pointera + 1 );
printf("Enter 3rd and 4th valuen");
char *tmp = realloc(*pointera, 4 * sizeof(char)); 
if ( tmp != NULL )
{
*pointera = tmp 
scanf(" %c %c",*pointera + 2, *pointera + 3 );
}
} 

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

我还包括一些小的代码修复,例如删除多余的指针强制转换。C 语言允许从void *到其他指针类型的隐式强制转换。

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

在通过scanf()函数读取每个字符后,还必须插入getchar()调用,因为scanf()在stdin中保留字符,下次使用%c格式调用scanf()将读取换行符而不是键入的字符。

所以有你的整个代码(固定),我尽量不改变逻辑甚至名称: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("%cn", pointer[i]);
}
}
void secValue(char **pointera) {
printf("First value is %cn", (*pointera)[0]);
printf("Enter 2nd valuen");
scanf("%c", &((*pointera)[1]));
getchar();
printf("Enter 3rd and 4th valuen");
*pointera = realloc(*pointera, 4 * sizeof(char));
scanf("%c %c", &((*pointera)[2]), &((*pointera)[3]));
}

干杯,gjm

相关内容

  • 没有找到相关文章

最新更新