0

是否可以通过其他变量访问变量值,如下所示

char var[30];
char buffer[30];

strcpy(buffer, "ABC");

/*variable var is holding the "buffer" variable name as string*/ 
strcpy(var,"buffer")

有没有办法通过变量 var 访问缓冲区变量值“ABC”。?

4

5 回答 5

3

在 C 中没有任何实际的方式,而且你也不想这样做。将程序逻辑与变量名称联系起来是一个可怕的想法。通常我看到人们在他们真正需要的是某种集合类型(以及数组、地图等)时尝试这样做。

如何让我们了解您试图解决的问题?

根据您的评论:

我需要动态调试消息,我有一个文件,其中包含我要打印的每个函数变量。

在宏中使用字符串化:

#define str(s) #s

int main() {
    int bar;
    str(bar) /* replaced by "bar" */
}
于 2012-06-19T23:32:42.150 回答
1

并非没有重要的样板代码。变量名在编译时被消除。

理论上,您可以存储从变量名到指向变量的指针的映射。

于 2012-06-19T23:32:59.083 回答
1

不,你不能。如果您想要间接访问,则声明一个指针并分配var给它。

char *forVar = var;

// Now you can access/modify via [] operator.
于 2012-06-19T23:33:31.997 回答
0

所以基本上你想在写入/读取/传递给函数等时记录一些变量?

如前所述,使用已编译的 C 执行此操作很困难,特别是如果您正在优化可执行文件(编译语句上的 -0n),在这种情况下,某些变量可能会完全消失,或者被其他变量重用。

使用 GDB

话虽如此,我知道 gdb 可以记录变量访问和类似的东西。如果您要编写 Python 脚本(请参阅http://sourceware.org/gdb/onlinedocs/gdb/Python.html),您应该能够编写脚本来记录变量内容。

有关更多信息,请参阅此问题:Do specific action when certain breakpoint hits in gdb

仅按需使用,使用预编译器脚本

或者,如果您只是想按需执行,最好使用预处理脚本添加自定义宏或类似内容,使用 csv 文件作为输入:

for each line in CSV:
  read variable_name, file_name, variable_type
  find all occurrences of variable_name in file_name
  for each occurrence
    insert printf(....)

仅按需使用,使用宏

祝你好运。没有一个很好的方法可以做到这一点,因为您通常需要某种查找,并且您需要一种有选择地将变量输出到您的打印函数的方法。在某些情况下,您可以执行以下操作:

static char _LOGGED_VAR_001 = 'z';
static char _LOGGED_VAR_002 = 'z';

#define cMyVar           _LOGGED_VAR_001
#define LOG_ALL_VARS()   printf("Vals: %c, %c", _LOGGED_VAR_001, _LOGGED_VAR_002)


void myFunc()
{
   char cMyVar; // Gets macro'd to _LOGGED_VAR_001 with LOCAL scope
   cMyVar = 'a'; // LOCAL scope _LOGGED_VAR_001 becomes 'a'
   LOG_ALL_VARS(); // At this point you print out the LOCAL _LOGGED_VAR_001 
                   // and the global _LOGGED_VAR_002
}

你会得到Vals: a, z

这非常丑陋,仅适用于具有局部范围的变量,内存消耗混乱,可能容易出错并且通常是一个坏主意

按需,堆/堆栈转储

如果您有足够的存储空间,您可以按需将所有内存转储到文件中。这可能不是很便携,这取决于它是如何完成的。我不确定如何以可靠的方式做到这一点。

推荐

使用 GDB 进行设计时诊断。这就是它的设计目的:)

对于(例如)分析已发布的代码(自动错误报告),完整转储然后随意分析可能是相关的。

于 2012-06-20T02:14:50.107 回答
0

您可以尝试使用工会

例如:

union example {
    char var[40];
    char buffer[40];
} e1;

strcpy(e1.var, "ABC");

printf("%s is same as %s", e1.var, e1.buffer);
于 2012-06-19T23:32:27.943 回答