小编Vag*_*ish的帖子

C:通过引用传递自动变量

我遇到了一段目前工作正常的代码,但在我看来,它的未定义行为可能会在将来引入一个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标准中是否有任何保证两种情况下的行为?或者正如我之前所说的未定义的行为?

c cpu-registers

4
推荐指数
1
解决办法
149
查看次数

DMA传输比CPU传输花费更多的时间

我们的任务旨在证明使用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)

c stm32 memcpy dma

4
推荐指数
2
解决办法
256
查看次数

为什么strcmp()返回'0'虽然我没有提供空终止字符串?

在下面的代码中,我期待一些奇怪的行为(如无限循环),因为我没有提供空终止字符串作为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

3
推荐指数
2
解决办法
637
查看次数

如何在以下情况下获取数组的sizeof:

我用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_1Buffer_2间接通过CommandArray?更确切地说,我应该知道基于索引的SOB1或SOB2的值char * CommandArray[2]

c

3
推荐指数
1
解决办法
88
查看次数

以下定义实际上在做什么?

在SO的一个问题中,我遇到了下面的定义:

char randchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" [rand() % 26]; 
Run Code Online (Sandbox Code Playgroud)

我知道这rand() % 26会给出0到25之间的随机数.但是上面的定义实际上发生了什么?当评估表达式时(编译时或运行时)?堆栈的包含内容是什么.

我们在C中称之为这样的定义.这个特征是什么?

c arrays

3
推荐指数
1
解决办法
57
查看次数

char*指向哪里?

关于指针和内存分配,我有一些非常基本的问题.

  1. 在下面的代码指针c实际指向哪里?换句话说,字符串在哪里"xyz"存储在内存中(堆栈/堆等)?

  2. a因为我不再使用它而将分配给内存位置会发生什么?

  3. 如果我取消评论评论部分,代码似乎运作良好.在这种情况下,记忆发生了什么?

    #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)

编辑:

在阅读了一些答案和第一条评论之后,我想到了另一个问题:

  1. 在下面的情况下,字符串存储在哪里?我可以稍后更改它们吗?

      char *c[] = {"a","xyz"};
    
    Run Code Online (Sandbox Code Playgroud)

c

1
推荐指数
1
解决办法
107
查看次数

如何删除printf语句中的空格

我在eclipse中编写ac程序以从串行设备接收数据.

它正确接收数据并将其存储在receivebuffer中.我使用的printf语句只打印4th,3rd2nd缓冲的元素安慰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中是否有任何删除空间的功能.请帮忙.谢谢.

c eclipse printf space

-5
推荐指数
1
解决办法
1330
查看次数

标签 统计

c ×7

arrays ×1

cpu-registers ×1

dma ×1

eclipse ×1

memcpy ×1

printf ×1

space ×1

stm32 ×1