C 预定义/指定字符[]的大小、命名约定、轻松复制结构和使用符号获取函数地址
如何找到包含字符串的预定义char[]变量的大小? sizeof够了吗? 我不想使用strlen,因为字符串中可能会出现“\0”字符,并且出于优化原因。 例如:char str[]=Hello\x45\x10\x00 World 当标识符中有首字母时,您会怎么做?例如,GetURLParameters。 我想添加一个下划线:GetURL\u参数。这种情况的惯例是什么 如何轻松地将值复制到由变量/指针指向的结构的字段中? 例如,我想做一些类似的事情:C 预定义/指定字符[]的大小、命名约定、轻松复制结构和使用符号获取函数地址,c,C,如何找到包含字符串的预定义char[]变量的大小? sizeof够了吗? 我不想使用strlen,因为字符串中可能会出现“\0”字符,并且出于优化原因。 例如:char str[]=Hello\x45\x10\x00 World 当标识符中有首字母时,您会怎么做?例如,GetURLParameters。 我想添加一个下划线:GetURL\u参数。这种情况的惯例是什么 如何轻松地将值复制到由变量/指针指向的结构的字段中? 例如,我想做一些类似的事情: struct { int ba
struct {
int bar1;
char* bar2;
callback bar3;
} *foo = NULL;
foo = malloc(sizeof *foo);
*foo = { 0, "Hello World!", myFunc }; // This is wrong
为什么程序员有时会使用符号将函数地址分配给函数指针?例如:
void (*callback)(void);
callback = &myFunc;
对不起,我不能很好地编辑我的帖子。当我编辑和向您显示时,它看起来不同
如果是char[]而不是char*,sizeof将为您提供数组大小,对于以nul结尾的字符串,数组大小为strlen+1。如果您需要广泛地使用字符串,特别是其中可能有“0”字符的字符串和/或可能没有NUL终止的字符串,则应该考虑使用字符串库。这会让你的生活更轻松。
你要什么都行。我个人从不在标识符中使用大写字母,因为我认为混合案例标识符很难看。没有命名标识符的约定,只有一些人喜欢的约定。使用你和你的团队认为最好的东西。
您可以这样做:
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;
struct foo {
int a;
char *b;
} bar;
bar = (struct foo){0, "Hello"};
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;
}
我的fu标准让我不及格,所以我不知道为什么这样做,或者即使它确实有效,但我相信它确实有效。如果不起作用,只需创建一个init函数,将所有字段设置为默认值
一致性为指针分配地址时,通常是必需的,即int i=5,*j=&i;因此,尽管函数指针并不是严格必需的,但有些人喜欢这样做,使所有指针赋值看起来都一样。这只是美学。
然而,在未来,这些问题中的大多数是相互无关的。你不应该把四个不相关的问题组合成一个巨大的怪物问题,而是分开问。这会让你花更多的时间来做每一件事,每一件事都会更加连贯一致,这样我们就能给你更好的答案,你也会学到更多
如果是char[]而不是char*,sizeof将为您提供数组大小,对于以nul结尾的字符串,数组大小为strlen+1。如果您需要广泛地使用字符串,特别是其中可能有“0”字符的字符串和/或可能没有NUL终止的字符串,则应该考虑使用字符串库。这会让你的生活更轻松。
你要什么都行。我个人从不在标识符中使用大写字母,因为我认为混合案例标识符很难看。没有命名标识符的约定,只有一些人喜欢的约定。使用你和你的团队认为最好的东西。
您可以这样做:
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;
struct foo {
int a;
char *b;
} bar;
bar = (struct foo){0, "Hello"};
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;
}
我的fu标准让我不及格,所以我不知道为什么这样做,或者即使它确实有效,但我相信它确实有效。如果不起作用,只需创建一个init函数,将所有字段设置为默认值
一致性为指针分配地址时,通常是必需的,即int i=5,*j=&i;因此,尽管函数指针并不是严格必需的,但有些人喜欢这样做,使所有指针赋值看起来都一样。这只是美学。
然而,在未来,这些问题中的大多数是相互无关的。你不应该把四个不相关的问题组合成一个巨大的怪物问题,而是分开问。这会让你花更多的时间来做每一件事,每一件事都会更加连贯一致,这样我们就能给你更好的答案,你也会学到更多
sizeof就足够了
品味问题。我根本不在标识符中使用大写字母,除非它们是全局常量
您可以这样做:
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;
struct foo {
int a;
char *b;
} bar;
bar = (struct foo){0, "Hello"};
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;
}
如果myFunc是一个函数,则使其显式(尽管不是必需的)
sizeof就足够了
品味问题。我根本不在标识符中使用大写字母,除非它们是全局常量
您可以这样做:
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;
struct foo {
int a;
char *b;
} bar;
bar = (struct foo){0, "Hello"};
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;
}
如果myFunc是一个函数,则使其显式(尽管不是必需的)
如果要将值从一个结构复制到另一个结构,可以执行以下操作:
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;
struct foo {
int a;
char *b;
} bar;
bar = (struct foo){0, "Hello"};
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.
如果要将值从一个结构复制到另一个结构,可以执行以下操作:
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;
struct foo {
int a;
char *b;
} bar;
bar = (struct foo){0, "Hello"};
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.
2我使用c建议 如果是两个首字母,则为所有大写字母,否则仅为首字母大写字母。例子
DSPointer、FtpServer、getHDSeekTime、sendsmtmessage我使用c建议 如果是两个首字母,则为所有大写字母,否则仅为首字母大写字母。例子 DSPointer、FtpServer、getHDSeekTime、sendsmtmessage 通常,数组中的元素数由表达式sizeof arr/sizeof arr[0]或sizeof arr/sizeof*arr给出。 sizeof运算符返回数组的大小(以字节为单位),而不是元素数,因此必须将数组中的字节数除以单个元素中的字节数。但是,由于sizeof char==1,您可以通过sizeof arr获得char数组中的元素数。请注意,表达式arr必须是数组类型,而不是指针类型。例如,如果arr作为类型为T arr[]的函数参数传递,则它是指针类型,sizeof将为您提供指针中的字节数,而不是数组本身 有许多约定,没有一个比其他约定更好。你选择哪种习惯并不重要,只要你始终如一地使用它 C89不支持这样的复合文本。C99是的,它应该看起来像*foo=struct s{0,你好,World,myfunc};假设将标记s添加到结构定义中。然而,我对C99的特性不太熟悉,所以不要把它当作福音 习惯。实际上,它什么也不做。不管怎样,在通常的转换规则下,函数指示符被隐式转换为指向函数的指针 通常,数组中的元素数由表达式sizeof arr/sizeof arr[0]或sizeof arr/sizeof*arr给出。sizeof运算符返回以字节为单位的数组大小,而不是元素数,因此必须将数组中的字节数除以单个元素中的字节数。但是,由于sizeof char==1,您可以通过sizeof arr获得char数组中的元素数。请注意,表达式arr必须是数组类型,而不是指针类型。例如,如果arr作为类型为T arr[]的函数参数传递,则它是指针类型,sizeof将为您提供指针中的字节数,而不是数组本身 有许多约定,没有一个比其他约定更好。你选择哪种习惯并不重要,只要你始终如一地使用它 C89不支持这样的复合文本。C99是的,它应该看起来像*foo=struct s{0,你好,World,myfunc};假设将标记s添加到结构定义中。然而,我对C99的特性不太熟悉,所以不要把它当作福音 习惯。实际上,它什么也不做。不管怎样,在通常的转换规则下,函数指示符被隐式转换为指向函数的指针
对不起,我们不是来做别人的家务的,这不是家庭作业,真的。我不明白你为什么这么想。无论如何谢谢。对不起,我们不是来做别人的家务的。这不是家庭作业,真的。我不明白你为什么这么想。不管怎样,谢谢。好的,谢谢,我是新来的,所以我不知道所有的不成文规则。我认为连续地提出太多的问题是自私的或是别的什么。@chrislutz-这段代码不适合我。我使用的是与cygwin捆绑在一起的g++版本,不确定确切的版本号。我想你需要对malloc进行强制转换,如果我错了,请随意更正。@dcp:为什么你在C代码上使用g++而不是gcc?Maloc不需要在C中强制转换。MulalCalm的争论可以继续进行,但总而言之:如果需要人们用C++编译器编译它,你就没有选择,必须进行转换。如果您不需要,您可以根据需要进行强制转换,但是如果您不需要,a您将收到警告,如果您忘记在强制转换中包含,它将自动失败,因为malloc已获得一个隐式签名,b如果稍后类型更改,例如,从char*到wchar\u t*您不需要返回并更改所有类型转换,这与使用sizeof*foo而不是sizeofstruct foo的原因相同。第二个是最引人注目的。请注意,sizeof将给出数组的大小(以字节为单位),而不是元素的数量。对于char数组,这是相同的,但对于其他类型,情况并非如此。对于类型为T的数组,其中T不是char,元素的数量由sizeof arr/sizeof arr[0]给出。好的,谢谢,我是新来的,所以我不知道所有不成文的规则。我认为连续地提出太多的问题是自私的或是别的什么。@chrislutz-这段代码不适合我。我使用的是与cygwin捆绑在一起的g++版本,不确定确切的版本号。我想你需要对malloc进行强制转换,如果我错了,请随意更正。@dcp:为什么你在C代码上使用g++而不是gcc?Maloc不需要在C中强制转换。MulalCalm的争论可以继续进行,但总而言之:如果需要人们用C++编译器编译它,你就没有选择,必须进行转换。如果您不需要,您可以根据需要进行强制转换,但是如果您不需要,a您将收到警告,如果您忘记在强制转换中包含,它将自动失败,因为malloc已获得一个隐式签名,b如果稍后类型更改,例如,从char*到wchar\u t*您不需要返回并更改所有类型转换,这与使用sizeof*foo而不是sizeofstruct foo的原因相同。第二个是最重要的 请注意,sizeof将给出数组的大小(以字节为单位),而不是元素数。对于char数组,这是相同的,但对于其他类型,情况并非如此。对于类型为T的数组,其中T不是char,元素数由sizeof arr/sizeof arr[0]给出。