gpt4 book ai didi

c - 即使使用 volatile ,变量也不会更新,没有线程

转载 作者:行者123 更新时间:2023-11-30 20:51:13 25 4
gpt4 key购买 nike

我有以下 printf 语句,它打印函数的输出:

printf("\nStart-Time %s,End-Time %s",
get_time(myfields[i].start_mn),
get_time(myfields[i].end_mn));

在该语句中,使用不同的参数调用 get_time 函数两次。但是,即使该函数在两次调用中返回不同的字符串,printf 也只会为第二次调用打印第一次调用的返回值。我已经尝试了函数返回变量和函数本身的 volatile 关键字,但输出仍然相同。但是,如果我将 printf 语句拆分为两个 printf 语句来分别打印值,它们将打印预期的不同值。

那么有人可以告诉我这里发生了什么以及这样做的正确方法是什么吗?

<小时/>

[评论更新:]

get_time 返回一个全局 char 数组。 char *get_time(int tval) 将时间(以分钟为单位)转换为小时。

最佳答案

So can anyone point to me what is happening here and what is the correct way of doing this?

每次调用 get_time() 都会将相同的地址返回到同一个缓冲区,然后将其传递给 printf(),后者会在这个缓冲区中查找已包含的内容被放在最后,“最后”的意思是“时间上最后的”。

要解决此问题,请创建临时缓冲区以传递给 printf():

char * p1 = strdup(get_time(...));
char * p2 = strdup(get_time(...));

printf("\nStart-Time %s,End-Time %s", p1, p2);

/* Free the temporary buffers. */
free(p1);
free(p2);

如果您提前知道 get_time() 返回的最大大小,则可以使用更简单的方法:

#define GET_TIME_LEN_MAX 32

...

char b1[GET_TIME_LEN_MAX];
char b2[GET_TIME_LEN_MAX];

strcpy(b1, get_time(...));
strcpy(b2, get_time(...));

printf("\nStart-Time %s,End-Time %s", b1, b2);

后一个示例的安全版本:

#define GET_TIME_LEN_MAX 32

...

/* Define buffers and initialise them to ALL zeros. */
char b1[GET_TIME_LEN_MAX] = "";
char b2[GET_TIME_LEN_MAX] = "";

strncpy(b1, get_time(...), GET_TIME_LEN_MAX - 1);
strncpy(b2, get_time(...), GET_TIME_LEN_MAX - 1);

printf("\nStart-Time %s,End-Time %s", b1, b2);
<小时/>

strdup()不是标准 C,为了完整起见,请在下面找到一个自行开发的实现:

#include <stdlib.h> /* for malloc() */
#include <string.h> /* for strcpy() */


char * strdup(const char * s)
{
char * p = NULL;

if (NULL != s)
{
p = malloc(strlen(s) + 1);
if (NULL != p)
{
strcpy(p, s);
}
}

return p;
}

关于c - 即使使用 volatile ,变量也不会更新,没有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34004089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com