用C打印字符?为什么这很奇怪?

时间:2015-04-12 06:02:16

标签: c struct malloc free

我正在尝试使用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: /

这对我来说没有意义,为什么它打印这个正斜杠。我知道可能还有其他解决方案来实现打印这个目标。但是,这是一个非常大的文件的提炼版本,我需要知道为什么会发生这种情况。不幸的是,替代解决方案对我没有帮助 提前致谢。

5 个答案:

答案 0 :(得分:2)

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

请参阅此处的输出: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);
} 

答案 1 :(得分:1)

问题是func_3按值传递其参数,而不是通过指针传递。这意味着,当您致电func_3(aStruct)时,它会将aStruct的内容复制到全新的myStruct对象中。然后func_3初始化它。最后它返回main,丢弃其全新副本,留下原始未定义内容aStruct

解决方案是将func_3更改为void func_3(struct myStruct* Input)

答案 2 :(得分:1)

结构在函数参数中按值复制;这意味着您要更改aStruct的副本;原件仍然没有初始化。您的函数也会泄漏内存(malloc)并且通常还会出现指针使用的其他问题。

此外,您正在打印&#34;字&#34;作为%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;
}

答案 3 :(得分:1)

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;
}

答案 4 :(得分:0)

因为void func_3(struct myStruct Input) Input只是aStruct的副本。
aStruct未初始化,因此其值未定义。