使用两个不同的数组打印每个字符的值和内存位置?

时间:2017-02-08 16:49:40

标签: c arrays pointers

我有一个函数,里面有两个数组。 在第一个循环中,我将指针初始化为NULL 在第二个循环中,我将每个指针设置为指向另一个数组中的一个字符。所以在指针数组的位置[0]中有一个指向字符数组位置[0]等的字符指针。 在第三个循环中,我打印出每个字符的值和内存位置。

但是,我的代码没有按预期工作,导致IDE崩溃:

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

    void printName(char *pointer);

    int main (void)
    {
     char *name = "Example";
     printName(*name);    
     return 0;
    }
    void printName(char *pointer)
    {
        char arrayOfChars[10];
        char arrayOfPointers[10];

        for(int i = 0; i < 10; i++)
        {
             arrayOfPointers[i] = NULL;
        }
        for(int i = 0; i <= 10; i++)
        {
             arrayOfPointers[i] = &arrayOfChars[i];
        }
        for (int i = 0; i <= 10; ++i)
        {
             printf("Value: %d, addr: %p\n", pointer[i], pointer+i);
        }
    }

4 个答案:

答案 0 :(得分:1)

你有几个错误,第一个是@George在评论中指出的:

 char *name = "Example";
 printName(*name);    
 return 0;
}

void printName(char *pointer)

printName期待指向char的指针,但您正在通过(由于取消引用*)一个char,只是通过printName(name);

在这里:

arrayOfPointers[i] = NULL;

您正在指定一个指向char

的指针

同样适用于

arrayOfPointers[i] = &arrayOfChars[i];

如果你想要一个指针数组(如评论所示),请使用

char arrayOfChars[10];
char *arrayOfPointers[10];

此外,您需要检查循环中的尾随NUL字符,因为您正在读取数组的边界之外。

答案 1 :(得分:0)

您的问题出在主要功能

int main (void)
{
   char *name = "Example";
   printName(*name);
   return 0;
}

变化

printName(*name);

printName(name);

因为printName函数需要pointer不是解除引用的值

另外,这个

char arrayOfPointers[10];

不是指针数组。 将其更改为

char *arrayOfPointers[10];

答案 2 :(得分:0)

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

        void printName(char *pointer);

      int main (void)
       {
          char *name = "Example";
           printName(name);
          return 0;
          }
      void printName(char *pointer)
          {
             int i;
         char arrayOfChars[10];
           char arrayOfPointers[10];

            // set values to null
         for(i = 0; i < 10; i++)
            {
            arrayOfPointers[i] = NULL;
             }
           // set each pointer to point to one character in the other array
          for(i = 0; i < 10; i++)
              {
              arrayOfPointers[i] = &arrayOfChars[i];
            }
                 // print value and memory location:
            for (i = 0; i < 10; ++i)
             {
                    printf("Value: %d, addr: %p\n", pointer[i], pointer+i);
              }
            }

试试这段代码吧。你正在多次初恋我可能是错误。并且还将名称传递给funtion而不是* name,因为我们必须传递地址而不是该地址的值

答案 3 :(得分:0)

更改:printName(* name); to printName(name);因为你已经将它定义为指针数组

在定义arrayOfPointers时,请确保将其定义为指针数组: char * arrayOfPointers [10]; 这是为了避免转换错误。

此外,如果要打印char值而不是ASCII值:使用%c更改%d: printf(“值:%c,addr:%p \ n”,指针[i],指针+ i);

注意:您的代码使用静态数组大小而不是动态。因此,打印“示例”地址时将获得的最后三个值将是垃圾值。