在C中打印一个字符?为什么奇怪?

Printing of a character in C? Why is it strange?

我正在尝试使用 malloc/free 组合在 C 中打印一个字符。结果很奇怪,想不通原因:

# include <stdio.h>
# include <stdlib.h> 
# include <netdb.h> 
# include <unistd.h>
# include <sys/time.h>

struct myStruct
{
  char* word;
  int num;
};

void func_3(struct myStruct Input){

  struct myStruct* addr; 
  addr = &Input;
  addr = malloc(sizeof(struct myStruct));
  (&Input) -> num = 7;
  (&Input) -> word = "some stuff here";
  printf("This is Input word %s\n", (&Input) -> word);
} 


int main(int argc, char const *argv[])
{
  struct myStruct myStruct_ptr;
  struct myStruct aStruct; 
  func_3(aStruct);

  printf("This is my struct's word: %c", aStruct.word);

  return 0;
}

输出:

This is Input word some stuff here
This is my struct's word: /

我不明白为什么要打印这个正斜杠。我知道可能还有其他解决方案可以实现打印此目标的相同目标。但是,这是一个非常大的文件的精简版本,我需要知道为什么会这样。不幸的是,替代解决方案对我没有帮助。
提前致谢。

问题是 func_3 按值而不是指针传递其参数。这意味着,当您调用 func_3(aStruct) 时,它会将 aStruct 的内容复制到一个全新的 myStruct 对象中。然后 func_3 初始化它。最后它 returns 到 main,扔掉了它的全新副本,给你留下了 aStruct

的原始未定义内容

解决办法是把func_3改成void func_3(struct myStruct* Input)

我已经修复了你的代码。请看我的评论。

在此处查看输出:https://ideone.com/IP2AR1

#include <stdio.h>

struct myStruct
{
  char* word;
  int num;
};

void func_3(struct myStruct *Input){
  Input->num = 7;                                         // <- edit struct member
  Input->word = "some stuff here";                        // <- edit struct member
  printf("This is Input word %s\n", Input->word);
} 


int main(int argc, char const *argv[])
{
  struct myStruct aStruct;
  func_3(&aStruct); // <- pass here

  printf("This is my struct's word: %s\n", aStruct.word); // <- print char array
  printf("This is my struct's word: %c", *aStruct.word);  // <- print first char


  return 0;
}

您的旧密码:

void func_3(struct myStruct Input){                      // <- pointer needed

  struct myStruct* addr;                                 // <- not used
  addr = &Input;
  addr = malloc(sizeof(struct myStruct));
  (&Input) -> num = 7;                                   // <- not being saved
  (&Input) -> word = "some stuff here";                  // <- not being saved
  printf("This is Input word %s\n", (&Input) -> word);
} 

结构在函数参数中按值复制;这意味着您正在更改 aStruct 的副本;原来的保持未初始化。您的函数还会泄漏内存 (malloc),并且通常在指针使用方面存在其他问题。

此外,您将 "word" 打印为 %c 而不是 %s;这通常会打印指针值的第一个字节,但实际上它可能是未定义的行为,因为指针不必与 char 兼容。

您应该向 func_3 传递一个指向结构的指针,而不是实际的结构:

void func_3(struct myStruct *input){
    input->num = 7;
    input->word = "some stuff here";
    printf("This is Input word %s\n", input->word);
} 


int main(void)
{
    struct myStruct aStruct; 
    func_3(&aStruct);

    printf("This is my struct's word: %s", aStruct.word);
    return 0;
}

因为在void func_3(struct myStruct Input)Input只是aStruct的一个副本。
aStruct没有初始化,所以它的值是未定义的。

aStruct 不是指针。您不能在此函数中使用 malloc

aStruct.word 是指向字符串第一个元素的指针。使用 *aStruct.wordaStruct.word[0]func_3 更改元素 Input,因此您必须使用 *Inputfunc_3(&aStruct);

显示此代码:

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

struct myStruct
{
  char* word;
  int num;
};

void func_3(struct myStruct *Input){
  (Input) -> num = 7;
  (Input) -> word = "some stuff here";
  printf("This is Input word %s\n", (Input) -> word);
} 


int main(int argc, char const *argv[])
{
  struct myStruct myStruct_ptr;
  struct myStruct aStruct; 
  func_3(&aStruct);

  printf("This is my struct's word: %c", *aStruct.word);

  return 0;
}