我正在尝试使用一个干净的方法将所有用户输入传递给程序的不同部分。
然而,有一个错误。我的问题是,包含用户参数之一的字符串被毫无理由地转换为垃圾值。
在send函数内部进行不相关的函数调用之前,字符串是完美的,之后,它会填充垃圾值。
提供了一个存在此问题的较大项目中已清理的片段。只显示与此问题相关的代码。
这发生在ubuntu上。
// weirdInputBug.c
#include <stdio.h>
#include <ctype.h>
typedef struct UserInput {
char command; // The character that represents the command to be executed
int argument1;
int intArgument2;
char *strArgument2;
} UserInput;
// This is to force the compiler to use all 3 variables in registers
int functionThatUsesManyParameters(int a, int b, int c) {
return a;
}
void send(int pid, char *msg) {
printf("msg in send before function call: %sn", msg); fflush(stdout);
// Force the compiler/program to use first 3 variable registers
int a, b, c;
functionThatUsesManyParameters(a, b, c);
printf("msg in send after function call: %sn", msg); fflush(stdout);
return;
}
// Return the user's command
UserInput getUserInput() {
// Initialize variables and get user input
char msg[40];
printf("Please type "s 1 hi": ");
fflush(stdin);
scanf("%s", msg);
msg[0] = toupper(msg[0]);
// Initialize structure variables
char command;
int argument1 = -1;
int intArgument2 = -1;
char strArgument2[40] = "";
// Assign structure variables
command = msg[0];
scanf("%d", &argument1);
scanf("%39s", strArgument2);
// Return completed structure
return (UserInput){command, argument1, intArgument2, strArgument2};
}
int main() {
// Get the user's input
UserInput userInput = getUserInput();
// Choose what the program does based on the command
switch (userInput.command) {
case 'S':
printf("msg in main: %sn", userInput.strArgument2); fflush(stdout);
send(userInput.argument1, userInput.strArgument2);
break;
default:
break;
}
}
Makefile:
run: weirdInputBug.c
gcc -o run weirdInputBug.c -I.
过程输出:
sephorol@ubuntu:~/Downloads/help$ ./run
Please type "s 1 hi": s 1 hi
msg in main: hi
msg in send before function call: hi
msg in send after function call: 0����
char strArgument2[40];
这是一个局部变量,存储在堆栈中。函数getUserInput()
返回一个结构,该结构指向作用域为左的局部变量。当第一次调用printf
时,这只是一个幸运的时刻。当第二次调用printf
时,堆栈包含垃圾数据,结构体指向该垃圾字符串值。