标签: c

size_t vs. uintptr_t

C标准保证这size_t是一种可以保存任何数组索引的类型.这意味着,逻辑上,size_t应该能够保存任何指针类型.我在Googles上发现的一些网站上看到这是合法的和/或应该始终有效:

void *v = malloc(10);
size_t s = (size_t) v;
Run Code Online (Sandbox Code Playgroud)

那么在C99中,标准引入了intptr_tuintptr_t类型,它们是有符号和无符号类型,保证能够保存指针:

uintptr_t p = (size_t) v;
Run Code Online (Sandbox Code Playgroud)

那么使用size_t和有uintptr_t什么区别?两者都是无符号的,并且两者都应该能够保存任何指针类型,因此它们在功能上看起来相同.除了清晰度之外,是否有任何真正令人信服的理由uintptr_t(或者更好的是,a void *)而不是a size_t?在一个不透明的结构中,字段只能由内部函数处理,有没有理由不这样做?

出于同样的原因,ptrdiff_t一直是一个能够保持指针差异的签名类型,因此能够容纳大多数指针,那么它与它intptr_t有何区别?

是不是所有这些类型基本上都服务于同一功能的不同版本?如果没有,为什么?对于其中一个我不能用另一个做什么我不能做什么?如果是这样,为什么C99会在语言中添加两种基本上多余的类型?

我愿意忽略功能指针,因为它们不适用于当前的问题,但随意提及它们,因为我有一种潜在的怀疑,它们将成为"正确"答案的核心.

c pointers size-t

245
推荐指数
5
解决办法
6万
查看次数

C中的箭头运算符( - >)用法

我目前正在通过阅读一本名为"21天自学C"的好初学者的书来学习C(我已经学习了Java和C#,所以我的动作速度要快得多).我正在阅读有关指针的章节,而 - >(箭头)操作符出现时没有解释.我认为它用于调用成员和函数(比如.(点)运算符,但是用于指针而不是成员).但我不完全确定.我可以获得解释和代码示例吗?

c syntax pointers

245
推荐指数
7
解决办法
44万
查看次数

C++或C中foo(void)和foo()之间有区别吗?

考虑这两个函数定义:

void foo() { }

void foo(void) { }
Run Code Online (Sandbox Code Playgroud)

这两者有什么区别吗?如果没有,为什么void那里的论点?美学原因?

c c++ arguments

243
推荐指数
3
解决办法
7万
查看次数

如何防止SIGPIPE(或正确处理它们)

我有一个小型服务器程序,它接受TCP或本地UNIX套接字上的连接,读取一个简单的命令,并根据命令发送一个回复.问题是客户端有时可能对答案没兴趣并且提前退出,因此写入该套接字将导致SIGPIPE并使我的服务器崩溃.什么是防止崩溃的最佳做法?有没有办法检查线的另一边是否还在读?(select()似乎在这里不起作用,因为它总是说套接字是可写的).或者我应该用处理程序捕获SIGPIPE并忽略它?

c io signals sigpipe broken-pipe

242
推荐指数
8
解决办法
19万
查看次数

为什么必须在C中链接数学库?

如果我包含<stdlib.h><stdio.h>在C程序中,我不必在编译时链接这些,但我必须链接到<math.h>,使用-lmgcc,例如:

gcc test.c -o test -lm
Run Code Online (Sandbox Code Playgroud)

这是什么原因?为什么我必须显式链接数学库而不是其他库?

c compilation math.h

241
推荐指数
7
解决办法
11万
查看次数

C/C++中整数除法的快速上限

给定整数值,x并且yC和C++都返回作为q = x/y浮点等效的底数的商.我对一种返回天花板的方法很感兴趣.例如,ceil(10/5)=2ceil(11/5)=3.

显而易见的方法包括:

q = x / y;
if (q * y < x) ++q;
Run Code Online (Sandbox Code Playgroud)

这需要额外的比较和乘法; 我见过的其他方法(事实上使用)涉及铸造为floatdouble.是否有更直接的方法可以避免额外的乘法(或第二个除法)和分支,并且还可以避免作为浮点数进行转换?

c c++ algorithm math

241
推荐指数
8
解决办法
14万
查看次数

类型后跟_t(下划线-t)代表什么?

这似乎是一个简单的问题,但我无法通过Stack Overflow搜索或Google找到它.什么类型后跟一个_t意思?如

int_t anInt;
Run Code Online (Sandbox Code Playgroud)

我在C代码中看到很多意味着与硬件紧密相关 - 我不禁认为它们是相关的.

c types naming-conventions

240
推荐指数
9
解决办法
8万
查看次数

如何在C中创建字符串数组?

我试图在C中创建一个字符串数组.如果我使用此代码:

char (*a[2])[14];
a[0]="blah";
a[1]="hmm";
Run Code Online (Sandbox Code Playgroud)

gcc给我"警告:从不兼容的指针类型分配".这样做的正确方法是什么?

编辑:我很好奇为什么这应该给编译器警告,因为如果我这样做printf(a[1]);,它正确打印"嗯".

c arrays string

240
推荐指数
9
解决办法
93万
查看次数

为什么这个for循环在某些平台上退出而不在其他平台上退出?

我最近开始学习C,我正在以C为主题.我正在玩循环,我遇到了一些我不知道如何解释的奇怪行为.

#include <stdio.h>

int main()
{
  int array[10],i;

  for (i = 0; i <=10 ; i++)
  {
    array[i]=0; /*code should never terminate*/
    printf("test \n");

  }
  printf("%d \n", sizeof(array)/sizeof(int));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的运行Ubuntu 14.04的笔记本电脑上,此代码不会中断.它运行完成.在我学校的运行CentOS 6.6的计算机上,它运行良好.在Windows 8.1上,循环永远不会终止.

更奇怪的是,当我将for循环条件编辑为:时i <= 11,代码只会在运行Ubuntu的笔记本电脑上终止.它永远不会在CentOS和Windows中终止.

任何人都可以解释内存中发生的事情以及运行相同代码的不同操作系统为什么会产生不同的结果?

编辑:我知道for循环超出范围.我是故意这样做的.我无法弄清楚不同操作系统和计算机之间的行为有何不同.

c debugging buffer-overflow undefined-behavior

240
推荐指数
9
解决办法
2万
查看次数

如何在vim中自动格式化/缩进C代码?

当我从另一个文件复制代码时,格式化混乱,如下所示:

fun()
{
for(...)
{
for(...)
{
if(...)
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)

如何在vim中自动格式化此代码?

c vim code-formatting

239
推荐指数
8
解决办法
15万
查看次数