我知道这个问题已经得到了回答,但我还有一些问题,我已经阅读了将指针传递给指针的其他答案,但我无法弄清楚如何访问值或存储它们。
代码还给出了错误分段错误(核心转储)
#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