我遇到了一段目前工作正常的代码,但在我看来,它的未定义行为可能会在将来引入一个bug.
伪代码:
void OpertateLoad(int load_id)
{
int value = 0;
/* code to calculate value */
SetLoadRequest(load_id,&value);
/*some processing not involving value**/
}
void SetLoadRequest(int load_id, int* value)
{
/**some processing**/
LoadsArray[load_id] = *value;
/**some processing**/
}
Run Code Online (Sandbox Code Playgroud)
在我的理解中,C编译器不保证Auto
将存储变量的位置.它可以是堆栈/寄存器(如果可用并且适合处理).
我怀疑如果编译器决定存储value
到通用寄存器,那么SetLoadRequest
函数可能会引用错误的数据.
我做对了吗?还是我在思考它?
我正在使用IARARM
编译器ARM CORTEX M-4
处理器.
- - - - - :编辑: - - - - -
答案总结一下"无论变量存储在何处,编译器都将确保数据在调用之间保持不变".
只是想确认:如果函数返回本地自动变量的地址并且调用者正在取消引用它,这种行为也是正确的吗?
如果否,则C标准中是否有任何保证两种情况下的行为?或者正如我之前所说的未定义的行为?
我们的任务旨在证明使用DMA复制大量数据与依靠处理器直接处理复制相比的好处。处理器是ST发现板上的STM32F407。
为了测量复制时间,必须在复制期间将GPIO引脚打开,并在复制后将其关闭。
该代码似乎是功能性,但它当前示出了CPU服用约2.15ms至完整和DMA约4.5ms,这是何意相反。我不确定是否没有足够的数据来提供更快的DMA速度来抵消设置数据的开销?
我尝试使用CPU和memcpy函数复制数组的元素,这似乎产生非常相似的时间。
功能代码如下所示:
DMASpeed(void)
{
#define elementNum 32000
int *ptr = NULL;
ptr = (int*)malloc(elementNum * sizeof(int));
int *ptr2 = NULL;
ptr2 = (int*)malloc(elementNum * sizeof(int));
for (int i = 0; i < elementNum; i++)
{
ptr[i] = 4;
}
LD5_GPIO_Port->BSRR = (uint32_t)LD5_Pin << 16U;
LD6_GPIO_Port->BSRR = (uint32_t)LD6_Pin << 16U;
// Initial value
// printf("BEFORE: dst = '%s'\n", dst);
// Transfer
printf("Initiate DMA Transfer...\n");
HAL_DMA_Start(&hdma_memtomem_dma2_stream0, (int)ptr, (int)ptr2, (elementNum * sizeof(int)));
LD5_GPIO_Port->BSRR = LD5_Pin;
printf("DMA …
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我期待一些奇怪的行为(如无限循环),因为我没有提供空终止字符串作为strcmp()函数的输入.
#include <stdio.h>
int main()
{
char string1[20];
char string2[20] = {'H','e','l','l','o',};
strcpy(string1, "Hello");
// strcpy(string2, "Hellooo");
printf("Return Value is : %d\n", strcmp( string1, string2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Return Value is : 0
Run Code Online (Sandbox Code Playgroud)
为什么它向我显示两个字符串相等?
我的猜测是当我初始化数组(string2)时,rest元素被填充为零.但是因为数组是本地的,所以不应该是这种情况.
我用C编写了一个代码,如下所示,
#define SOB1 10
#define SOB2 20
char Buffer_1[SOB1];
char Buffer_2[SOB2];
char * CommandArray[2] = {Buffer_1,Buffer_2};
Run Code Online (Sandbox Code Playgroud)
我如何获得Buffer_1
并Buffer_2
间接通过CommandArray
?更确切地说,我应该知道基于索引的SOB1或SOB2的值char * CommandArray[2]
在SO的一个问题中,我遇到了下面的定义:
char randchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" [rand() % 26];
Run Code Online (Sandbox Code Playgroud)
我知道这rand() % 26
会给出0到25之间的随机数.但是上面的定义实际上发生了什么?当评估表达式时(编译时或运行时)?堆栈的包含内容是什么.
我们在C中称之为这样的定义.这个特征是什么?
关于指针和内存分配,我有一些非常基本的问题.
在下面的代码指针c
实际指向哪里?换句话说,字符串在哪里"xyz"
存储在内存中(堆栈/堆等)?
a
因为我不再使用它而将分配给内存位置会发生什么?
如果我取消评论评论部分,代码似乎运作良好.在这种情况下,记忆发生了什么?
#include<stdio.h>
main()
{
char *c;
//c = (char *)malloc(2);
c = "a";
c = "xyz" ;
printf("%s",c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)输出:
xyz
Run Code Online (Sandbox Code Playgroud)
编辑:
在阅读了一些答案和第一条评论之后,我想到了另一个问题:
在下面的情况下,字符串存储在哪里?我可以稍后更改它们吗?
char *c[] = {"a","xyz"};
Run Code Online (Sandbox Code Playgroud)我在eclipse中编写ac程序以从串行设备接收数据.
它正确接收数据并将其存储在receivebuffer中.我使用的printf
语句只打印4th,3rd
和2nd
缓冲的元素安慰hex
格式.
以下是代码:
printf ("Output is %02x %02X %02X\n\n", receivebuffer[4], receivebuffer[3], receivebuffer[2]);
Run Code Online (Sandbox Code Playgroud)
它提供以下输出:
Output is 98 0E 88
Run Code Online (Sandbox Code Playgroud)
有没有办法可以删除每个字节之间的空格.我希望输出格式如下:
Output is 980E88
Run Code Online (Sandbox Code Playgroud)
c中是否有任何删除空间的功能.请帮忙.谢谢.