代码之家  ›  专栏  ›  技术社区  ›  Dor

预定义/分配的char[]的大小,命名约定,轻松复制结构并使用与号提取函数地址

c
  •  1
  • Dor  · 技术社区  · 15 年前
    1. 如何查找保存字符串的预定义char[]变量的大小? 尺寸是否足够? 我不想使用strlen(),因为字符串中可能会出现'\0'字符,而且出于优化原因。 例如。: char str[] = "Hello \x45\x10\x00 World!";

    2. 如果标识符中有首字母,你会怎么做?例如geturlparameters()。 我考虑添加一个下划线:geturl_parameters()。这种情况的惯例是什么?

    3. 如何轻松地将值复制到由变量/指针指向的结构的字段中? 例如,我想做类似的事情:

      struct {
      int         bar1;
      char*       bar2;
      callback    bar3;
      } *foo = NULL;
      foo = malloc(sizeof *foo);
      *foo = { 0, "Hello World!", myFunc };   // This is wrong
      
    4. 为什么程序员有时使用一个与符号来给函数指针分配一个函数地址?例如。:

      void (*callback)(void);
      callback = &myFunc;

      (对不起,我不能很好地编辑我的文章。当我编辑和向您显示时,它看起来不同)

    5 回复  |  直到 15 年前
        1
  •  1
  •   Chris Lutz    15 年前
    1. 如果是 char[] 而不是 char * ,请 sizeof() 将为您提供数组大小(即 strlen() + 1 对于以nul结尾的字符串)。如果您需要广泛使用字符串(尤其是那些可能具有 '\0' 其中的字符和/或不能以nul结尾)应考虑使用字符串库。它会让你的生活更轻松。
    2. 无论你想要什么。我个人从不在标识符中使用大写字母,因为我认为 MixedCaseIdentifiers 是丑陋的。没有命名标识符的约定,只有一些人喜欢的约定。使用你(和你的团队)认为最好的东西。
    3. 您可以这样做:

      struct s {
          int         bar1;
          char*       bar2;
          callback    bar3;
      };
      struct s *foo = NULL;
      static struct s default = { 0, "Hello, world!", myFunc };
      foo = malloc(sizeof *foo);
      *foo = s;
      

      我的标准不符合我的要求,所以我不知道为什么这是可行的(即使它是绝对可行的),但我相信它是可行的。如果它不起作用,你只需要 init 函数,将所有字段设置为其默认值。

    4. 一致性。当给指针分配地址时,通常是必要的,即 int i = 5, *j = &i; 因此,尽管函数指针不是严格必需的,但有些人喜欢这样做,以便所有指针分配看起来都相同。这只是美学。

    然而,在未来,这些问题中的大多数是相互无关的。你不应该把四个不相关的问题分成一个巨大的怪物问题,而应该分别问它们。这会让你花更多的时间来处理每一个问题,并且每个问题都会更加连贯,这样我们就能给你更好的答案(你会学到更多)。

        2
  •  1
  •   qrdl    15 年前
    1. sizeof 够了吗?

    2. 味道问题。我根本不在标识符中使用大写字母(除非它们是全局常量)

    3. 您可以这样做:

      struct foo {
          int   a;
          char  *b;
      } bar;
      
      bar = (struct foo){0, "Hello"};
      
    4. 使其明确,尽管这不是必要的,如果 myFunc 是一个函数。

        3
  •  1
  •   dcp    15 年前

    如果要将值从一个结构复制到另一个结构,可以执行以下操作:

    typedef struct {
        int         bar1;
        char*       bar2;
        int (*callback)(int);
    } mystruct;
    
    char str[] = "Hello \x45\x10\x00 World!";
    
    int main() { 
      mystruct* foo = (mystruct*)malloc(sizeof(mystruct));
      mystruct* foo2 = (mystruct*)malloc(sizeof(mystruct));
      foo->bar1 = 10;
      foo->bar2 = "hi";
    
      printf("foo->bar1 = %d, foo->bar2 = %s\n",foo->bar1,foo->bar2);
    
      memcpy(foo2,foo,sizeof(*foo));
    
      printf("foo2->bar1 = %d, foo2->bar2 = %s\n",foo2->bar1,foo2->bar2);
    
      free(foo);
      free(foo2);
      return 0;
    }
    

    输出:

    ---------- Capture Output ----------
    > "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe
    foo->bar1 = 10, foo->bar2 = hi
    foo2->bar1 = 10, foo2->bar2 = hi
    
    > Terminated with exit code 0.
    
        4
  •  1
  •   John Bode    15 年前
    1. 通常,数组中的元素数由表达式给出 sizeof arr / sizeof arr[0] (或) sizeof arr / sizeof *arr )这个 sizeof 运算符返回数组的大小 字节 ,而不是元素数,因此必须将数组中的字节数除以单个元素中的字节数。然而,由于 sizeof char == 1 根据定义,可以使用 sizeof arr .注意表达式 arr 必须是 数组 类型,而不是指针类型(例如,如果 ARR 作为类型化的函数参数传递 T arr[] ,那么它是指针类型,并且 西泽 将给出指针中的字节数,而不是数组本身)。

    2. 有很多约定,没有一个比其他约定更好。只要你始终如一地使用它,你选择哪种惯例并不重要。

    3. C89不支持这样的复合文字。是的,它应该看起来像 *foo = (struct s) {0, "Hello, World", myfunc}; (假设您添加了一个标签 s 到您的结构定义)。但是,我不太熟悉C99的特性,所以不要把它当作福音。

    4. 习惯。实际上,它什么也不做(函数指示符在通常的转换规则下被隐式转换为指向函数的指针)。

        5
  •  0
  •   pm100    15 年前

    2我使用C建议

    如果有两个首字母,则所有大写字母,否则只使用首字母大写字母。实例

    dspointer、ftpserver、gethdseektime、sendsmtpmessage