小编Myn*_*cks的帖子

资源获取是用C语言初始化

问题是:您能否仅使用我在此问题底部提供的资源来帮助我更好地理解C语言(而非c ++)中的RAII宏?我试图在我的脑海中进行分析,以了解它的含义以及它的意义(在我看来这是没有意义的)。语法很难。问题的重点是:我在阅读和理解奇怪的语法及其在C语言中的实现方面遇到困难。 例如,我可以轻松阅读,理解和分析以下交换宏(对我来说很有意义):

#define myswap(type,A,B) {type _z; _z = (A); (A) = (B); (B) = _z;} 
Run Code Online (Sandbox Code Playgroud)

(以下内容摘自本书:了解C指针)

GNU编译器使用C语言提供了非标准扩展来支持RAII。

GNU扩展使用一个名为RAII_VARIABLE的宏。它声明一个变量并与该变量关联:

  • 一种
  • 创建变量时要执行的函数
  • 当变量超出范围时执行的函数

    宏如下所示:

    #define RAII_VARIABLE(vartype,varname,initval,dtor) \
    void _dtor_ ## varname (vartype * v) { dtor(*v); } \
    vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
    
    Run Code Online (Sandbox Code Playgroud)

    例:

    void raiiExample() {
    RAII_VARIABLE(char*, name, (char*)malloc(32), free);
    strcpy(name,"RAII Example");
    printf("%s\n",name);
    } 
    
    int main(void){
        raiiExample();
    }
    
    Run Code Online (Sandbox Code Playgroud)

执行该功能时,将显示字符串“ RAII_Example”。不使用GNU扩展就可以达到类似的结果。

c gcc raii

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

引擎盖下不稳定

我想要一些帮助,以便更好地理解以下段落的一部分:
"volatile关键字限定符表示变量可以在程序之外进行更改.例如,外部设备可能会将数据写入端口.编译器有时会暂时使用缓存或寄存器将值保存在内存位置以进行优化.如果外部写入修改了内存位置,则此更改不会反映在缓存或寄存器值中." (它出自本书:理解和使用c指针,第178-179页)

歧义我已经是这些词组之间:"持有的价值一个内存位置"和"如果外部写入修改内存位置".

我的问题是:我得到的印象是,如果外部设备将数据写入端口,该数据将存储到某个位置(???),然后它们将被存储到寄存器/缓存(??)然后在内部c语言源代码的变量.有些东西被我误解了.据我所知,正常的工作流程应该是:外部设备 - >小型临时缓冲区 - > RAM内存中的变量,(当数据从小工具传输到MCU的RAM时)

#define PORT 0xB0000000
unsigned int volatile * const port = (unsigned int*) PORT;
*port = 0x0BF4; // write to port
value = *port; // read from port
Run Code Online (Sandbox Code Playgroud)

c embedded volatile

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

递归:在其位置反转字符串

递归.我检查了其他在线解决方案,它们似乎与我的完全相同.代码应该反转字符串(在其位置),但它不会.例如,当输入为st2 ="abcdefg"时,输出为空字符串.我期待st2 ="gfedcba".我错过了什么?

#include <stdio.h>
#include <string.h>


void recurse_reverse(char s[], int sz)
{
    int i=0,j = sz -1;
    if(i<j)
    {
        swap(&s[i],&s[j]);
        recurse_reverse(s+1, sz-2);

    }
}


void swap( char* s1, char *s2)
{
    char tmp;
    tmp = *s1;
    *s1 = *s2;
    *s2 = tmp;
}


int main(void)
{
    char st1[9] = "abcdefg", st2[9];
    strcpy(st2,st1);
    recurse_reverse(st2,9);
    printf("s1 = %s\ns2 = %s",st1,st2);
    printf("\n" );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c string recursion reverse

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

移位计数操作允许的值是多少?

#include <stdio.h>

int main(void)
{
    unsigned int var=1;
    var = var<<32;
    printf("%u ",var);
} 
Run Code Online (Sandbox Code Playgroud)

此代码1作为其输出产生.如果我写 var = var<<31;它的收益率2147483648.

如果我输入var = 12;然后var = var<<32;它产生12.我从我的教科书(旧版本)中读到,ANSI C不允许在单个操作中将所有位移出一个值.

所有主要的编译器都表现相同(复制粘贴输入到输出)或只是GCC确实将粘贴12从输入复制到输出当我指示它做var = var<<32;

c bit-shift

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

malloc,sizeof和strlen函数可能存在冲突吗?

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

typedef struct _person
{
    char *fname;
    char *lname;
    bool isavailable;
}Person;


Person *getPersonInstance(void)
{
    Person *newPerson = (Person*) malloc(sizeof(Person));
    if(newPerson == NULL)
        return NULL;
    return newPerson;
}

void initializePerson(Person *person, char *fname, char *lname, bool isavailable)
{
    person->fname = (char*) malloc(strlen(fname)+1);
  /*problematic behaviour if i write: person->fname = (char*) malloc (sizeof(strlen(fname)+1)); */

    person->lname = (char*) malloc(strlen(lname)+1);
 /*problematic behaviour if i write: person->lname = (char*) malloc (sizeof(strlen(lname)+1)); */

    strcpy(person->fname,fname);
    strcpy(person->lname,lname);
    person->isavailable = isavailable; …
Run Code Online (Sandbox Code Playgroud)

c malloc sizeof strlen

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

标签 统计

c ×5

bit-shift ×1

embedded ×1

gcc ×1

malloc ×1

raii ×1

recursion ×1

reverse ×1

sizeof ×1

string ×1

strlen ×1

volatile ×1