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