Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法访问数组元素?_C - Fatal编程技术网

C 无法访问数组元素?

C 无法访问数组元素?,c,C,我有一个数组,我正试图通过增加ptr来访问它的元素,正如这里所建议的…我一定在做一些愚蠢的事情…请帮帮我 #include <stdio.h> #include <stdlib.h> int main() { int i; char *p1 = "Cnversions"; char *p2 = "Divided"; char *p3 = "Plain"; char *p4 = "Solid"; char *arr

我有一个数组,我正试图通过增加ptr来访问它的元素,正如这里所建议的…我一定在做一些愚蠢的事情…请帮帮我

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


int main()
{
   int i;

   char *p1 = "Cnversions";  
   char *p2 = "Divided";  
   char *p3 = "Plain";  
   char *p4 = "Solid";  

   char *arr[3];

   arr[0] = p1;
   arr[1] = p2;
   arr[2] = p3;
   arr[3] = p4;



   for(i=0;i<=3;i++)
   {

      printf("string at arr[%d] is: %s\n",i,*arr);

     arr++;
    }

   return 0;

  }
#包括
#包括
int main()
{
int i;
char*p1=“Cnversions”;
char*p2=“分割”;
char*p3=“普通”;
char*p4=“固体”;
char*arr[3];
arr[0]=p1;
arr[1]=p2;
arr[2]=p3;
arr[3]=p4;

对于(i=0;i像
arr
这样的数组位于内存中的特定位置,因此增加
arr
是没有意义的(增加数组意味着什么?)

相反,您需要创建一个指向数组开头的指针,并递增该指针:

char **ptr = arr;
for(i=0; i<4; i++) {
    printf("arr[%d] = %s\n", i, *ptr);
    ptr++;
}
char**ptr=arr;

对于(i=0;i请记住,尽管我们倾向于将双指针视为数组,但所有编译器都将它们视为指针。当递增指针时,它会向指针地址添加一个值,该值等于它所指向的数据类型的大小。例如:

int *p;
p = (int *) malloc(sizeof(int));
p
指向一个
int
,因此
p
的指向数据的大小(通常)为4字节。这意味着当您增加
p
时,它将指向比以前大4字节的位置


arr
的类型是
char**
,这意味着它是指向
char
的指针。现在大多数机器上的指针都是8字节。因此,当你增加
arr
时,你实际上是在告诉计算机将
arr
设置为指向一个比以前高8字节的地址。在在
arr
的情况下,这是一个非法地址,因此您会遇到某种崩溃。

不要增加
arr
。另外
arr
的大小应为4。出于安全原因和良好的编程实践,p1到p4以及arr应声明为
const