【问题标题】:printing the value and memory location of each character by using two different arrays?使用两个不同的数组打印每个字符的值和内存位置?
【发布时间】:2017-02-08 16:49:40
【问题描述】:

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

但是,我的代码没有按预期工作,导致 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);
        }
    }

【问题讨论】:

  • printName(*name); -> printName(name);
  • 并将第二个循环更改为int i = 0; while( pointer[i] != '\0' ){ arrayOfPointers[i] = &amp;pointer[i]; i++; },将第三个循环更改为i = 0; while( pointer[i] != '\0' ){ printf("Value: %d, addr: %p\n", pointer[i], arrayOfPointers[i]); i++; }哦,还有char arrayOfPointers[10]; - > char* arrayOfPointers[10];
  • 检查你的编译器错误信息...如果没有,那么你需要重新配置编译器

标签: c arrays pointers


【解决方案1】:

你有几个错误,第一个是由 cmets 中的@George 指出的:

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

void printName(char *pointer)

printName 需要一个指向 char 的指针,但您正在传递(由于取消引用 *)单个 char,只需传递 printName(name);

这里:

arrayOfPointers[i] = NULL;

你正在分配一个指向char的指针

同样

arrayOfPointers[i] = &amp;arrayOfChars[i];

如果你想要一个指针数组(正如评论所建议的那样)使用

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

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

【讨论】:

    【解决方案2】:
        #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);
                  }
                }
    

    试试这段代码。您正在多次初始化 i 可能是错误。并将名称传递给函数而不是 *name,因为我们必须传递地址而不是该地址的值

    【讨论】:

      【解决方案3】:

      更改:printName(*name);打印姓名(姓名);因为你已经将它定义为一个指针数组

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

      此外,如果您想打印 char 值而不是其 ASCII 值:将 %d 更改为 %c: printf("值: %c, 地址: %p\n", 指针[i], 指针 + i);

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

      【讨论】:

        猜你喜欢
        • 2018-08-02
        • 1970-01-01
        • 2021-08-30
        • 2017-08-12
        • 1970-01-01
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        • 2022-11-21
        相关资源
        最近更新 更多