我是C的新手,仍在尝试找出指针。
所以这是我遇到的一个任务:我想将 10 个水果名称分配给数组指针并将它们一一打印出来。下面是我的代码;
#include <stdio.h>
#include <string.h>
int main(){
char *arr_of_ptrs[10];
char buffer[20];
int i;
for (i=0;i<10;i++){
printf("Please type in a fruit name:");
fgets(buffer,20,stdin);
arr_of_ptrs[i]= *buffer;
}
int j;
for (j=0;j<10;j++){
printf("%s",*(arr_of_ptrs+j));
}
}
但是,在执行此操作后,它仅向我显示所有 10 个响应的最后一个结果。我试图咨询其他人问的类似问题,但没有运气。
我的理解是 1( 数组的指针已使用 [10] 分配内存,因此不需要 malloc((。
2(缓冲区存储指向每个单独答案的指针,因此我取消引用它并将其分配给arr_of_ptrs[i] 我不确定arr_of_ptrs[i] 是给我一个指针还是一个值。我认为它绝对是一个指针,但我尊重它与 * 代码并将其分配给 *buffer,程序会卡住。
如果有人能指出我的问题,那就太好了。
提前致谢
三个 erros,1。您必须为 arr_of_ptrs 元素的元素分配内存,现在您只需为堆栈内存上的 arr_of_ptrs 元素分配内存。2.arr_of_ptrs[i]= *buffer;
表示所有arr_of_ptrs元素都指向相同的内存地址,即"缓冲区"指针。因此,arr_of_ptrs的所有元素都将与最后一个 stdin 输入字符串相同。3. 后续的 fgets(( 调用有潜在的问题,其中一个解释可能在这里
快速解决方案可能是,
#include <stdio.h>
#include <string.h>
int main(){
const int ARR_SIZE = 10, BUFFER_SIZE = 20;
char arr_of_ptrs[ARR_SIZE][BUFFER_SIZE];
char *pos;
int i, c;
for (i = 0; i < ARR_SIZE; ++i) {
printf ("Please type in a fruit name: ");
if (fgets (arr_of_ptrs[i], BUFFER_SIZE, stdin) == NULL) return -1;
if ((pos = strchr(arr_of_ptrs[i], 'n')))
*pos = 0;
else
while ((c = getchar()) != 'n' && c != EOF) {}
}
for (i = 0; i < ARR_SIZE; ++i)
printf("%sn", arr_of_ptrs[i]);
return 0;
}
误解可能是"取消引用"字符数组与取消引用指向基元数据类型的指针不同,不会创建该数组的副本。数组不能使用赋值运算符=
复制;有一个单独的函数用于复制数组(特别是对于 char aka c 字符串的 0 终止数组,以及用于分配复制所需的内存(:
将指针与基元数据类型进行比较,例如int
:
int x = 10;
int *ptr_x = &x;
int copy_of_x = *ptr_x; // dereferences a pointer to x, yielding the integer value 10
然而:
char x[20] = "some text"; // array of characters, not a single character!
char *ptr_x = &x[0]; // pointer to the first element of x
char copy_of_first_char_of_x = *ptr_x; // copies the 's', not the entire string
用:
char x[20] = "some text";
char *ptr_x = &x[0];
char *copy_of_x = malloc(strlen(ptr_x)+1); // allocate memory large enough to store the copy
strcpy(copy_of_x,ptr_x); // copy the string.
printf("%s",copy_of_x);
输出:
some text