【问题标题】:Storing a char in a char pointer将 char 存储在 char 指针中
【发布时间】:2010-07-30 16:07:17
【问题描述】:

我有一个全局变量 *char。我的主要函数标题为int main(int argc, char* argv[argc]){...}。这两行代码必须保持原样。我的主函数的第一个参数是*char 类型的数字,我使用atoi(...); 将其转换为字符。我基本上是将 ASCII 值更改为相应的字符。现在我想将我拥有的这个局部变量字符存储到作为 char 指针的全局变量中。我知道问题与内存分配有关,但我不知道该怎么做。

我的代码:

char* delim;
int main(int argc, char* argv[argc])
{
  char delimCharacter;
  if (isdigit(*(argv[3])) == 0) delim = argv[3]; //you can pass in a character or its ascii value
  else {   //if the argument is a number, then the ascii value is taken
    delimCharacter = atoi((argv[3]));
    printf("%s\t,%c,\n", argv[3], delimCharacter);
    //sprintf( delim, "%c", delimCharacter );  // a failed attempt to do this
    *delim = delimCharacter;
    //strncpy(delim, delimCharacter, 1);                // another failed attempt to do this
  }
  //printf("%s\n",delim);

这会产生一个段错误。

【问题讨论】:

  • 为什么不:int main(int argc, char** argv)

标签: pointers ascii segmentation-fault character allocation


【解决方案1】:

在开始使用它们之前,您需要验证您有(至少)3 个参数。

if (argc < 4)
{
    printf("Need 3 args");
    exit(1);
}

那么你需要分配一些内存来放入角色。

delim = malloc(2);
// TODO: Should check the result of malloc before using it.
*delim = delimCharacter;
delim[1] = 0; // Need to NULL terminate char*

【讨论】:

    【解决方案2】:

    您正在取消引用一个未初始化的指针。 delim 在进入 else 块时永远不会被初始化。

    【讨论】:

      【解决方案3】:
      char delim[] = ","; // anything really, as long as as it's one character string
      
      ...
      
      
      delim[0] = delimCharacter;
      

      【讨论】:

        【解决方案4】:

        除了你的记忆问题,我认为你对atoi 的作用感到困惑。它解析数字的字符串表示并返回等效的 int 值,例如“10000” => 10,000。我认为你认为它会给你一个字符的 ASCII 值,例如"A" =>65。

        既然你有一个char *,而且你(我认为)假设它包含一个字符,你可以简单地这样做:

        delimCharacter = *(argv[3]);
        

        但是,似乎根本不需要使用将这个值分配给char 变量的中间步骤。如果最终目标是让 delim 指向作为分隔符的字符,那么您似乎只需要这样做:

        delim = argv[3];
        

        这不仅删除了不必要的代码,而且意味着您不再需要为 delim 分配额外的内存来指向。

        我还将 delim 声明为 const char *,因为我认为没有理由更改它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-23
          • 2012-10-04
          • 2018-04-05
          • 2021-11-26
          • 2021-01-26
          • 1970-01-01
          相关资源
          最近更新 更多