小编Chr*_*utz的帖子

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转发stdin和stdout

我想重开stdinstdout(也许stderr当我在它)的文件句柄,从而使未来的呼叫printf()putchar()还是puts()会去到一个文件,以及未来的呼叫getc()和这种将来自一个文件.

1)我不想永久丢失标准输入/输出/错误.我可能希望稍后在程序中重用它们.

2)我不想打开新的文件句柄,因为这些文件句柄必须要么传递很多,要么全局传递(不寒而栗).

3)如果我无法帮助,我不想使用任何open()fork()其他系统相关的功能.

所以基本上,这样做是否有效:

stdin = fopen("newin", "r");
Run Code Online (Sandbox Code Playgroud)

而且,如果确实如此,我怎样才能得到原来的价值stdin?我是否必须将其存放在一个FILE *以后才能将其取回?

c redirect stdio

62
推荐指数
5
解决办法
12万
查看次数

如何杀死MacOS中的进程?

我试过kill -9 698但过程没有死.

$ ps -ef | grep chromium
  502   698   811   0   0:01.24 ??         0:07.28 /Users/lucius/chromium/src/xcodebuild/Debug/Chromium.app/Contents/MacOS/Chromium
  502   854   732   0   0:00.00 ttys001    0:00.00 grep chromium
$ kill -9 698


$ ps -ef | grep chromium
  502   698   811   0   0:01.24 ??         0:07.28 /Users/lucius/chromium/src/xcodebuild/Debug/Chromium.app/Contents/MacOS/Chromium
  502   854   732   0   0:00.00 ttys001    0:00.00 grep chromium
Run Code Online (Sandbox Code Playgroud)

macos

61
推荐指数
4
解决办法
11万
查看次数

PHP标准输入?

我知道PHP通常用于web开发,那里没有标准的输入,但是PHP声称是可用作通用脚本语言,如果你不遵循这是时髦的基于web的约定.我知道PHP打印到stdout(或者你想要调用的任何东西)printecho,这很简单,但我想知道PHP脚本如何从中获取输入stdin(特别是fgetc(),但任何输入函数都是好的),或者是这甚至可能吗?

php file-io stdin

53
推荐指数
9
解决办法
6万
查看次数

"以编程方式"执行/确定某些内容意味着什么?

编程.(alt.程序化)

我从来没有使用它,但我在问题中看到了很多,即"如何以编程方式确定[在此插入任务]".Firefox立即告诉我,这两个词都不是真的(至少,它不识别它们).我也从未见过他们在这里使用过的地方.

1)"以编程方式"执行/确定某些内容是什么意思?

2)为什么这么多人会问"如何以编程方式"做某事?是不是假设,如果你问如何在编程帮助板上做某事,你会问"如何"以编程方式"做到这一点?

3)为什么我从未在其他任何地方看到"以编程方式"这个词?

computer-science terminology

39
推荐指数
6
解决办法
3万
查看次数

GZip算法如何工作?

GZip文件压缩算法如何工作?如果有人有这方面的任何文件,我想阅读它.

gzip

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

如何使用函数指针调用函数?

假设我有这三个功能:

bool A();
bool B();
bool C();
Run Code Online (Sandbox Code Playgroud)

如何使用函数指针有条件地调用其中一个函数,如何声明函数指针?

c function-pointers

31
推荐指数
6
解决办法
10万
查看次数

C strcpy() - 邪恶?

有些人似乎认为C的strcpy()功能是坏的还是邪恶的.虽然我承认通常最好使用strncpy()以避免缓冲区溢出,但以下(strdup()对于那些不够幸运的人来说,这个函数的实现)安全地使用strcpy()并且永远不会溢出:

char *strdup(const char *s1)
{
  char *s2 = malloc(strlen(s1)+1);
  if(s2 == NULL)
  {
    return NULL;
  }
  strcpy(s2, s1);
  return s2;
}
Run Code Online (Sandbox Code Playgroud)

*s2保证有足够的空间来存储*s1,并且使用使得strcpy()我们不必将strlen()结果存储在另一个函数中以便稍后用作不必要的(在这种情况下)长度参数strncpy().然而,有些人用strncpy()或甚至memcpy()都需要长度参数来编写这个函数.我想知道人们对此的看法.如果您认为strcpy()在某些情况下是安全的,请说明.如果你有充分的理由不在strcpy()这种情况下使用,请给它 - 我想知道为什么使用strncpy()memcpy()在这种情况下可能更好.如果你认为strcpy()没问题,但不在这里,请解释.

基本上,我只是想知道为什么有些人memcpy()在别人使用时使用,strcpy()而其他人则使用普通用户strncpy().是否有任何逻辑可以优先选择三个(忽略前两个的缓冲区检查)?

c memcpy strcpy

22
推荐指数
9
解决办法
3万
查看次数

在OS X上安装Git

我想在Mac OS X Leopard上安装Git.我正试图避开MacPorts/Fink路线.我也试图避开Google上的安装程序,因为我自己走得很远,但如果必须的话,我会继续下载安装程序.

无论如何,我安装了Git./usr/local/bin/git.问题是没有安装任何文档,Makefile从不打扰告诉我.所以现在我让Git坐在那里等待使用,因为我尝试为它安装联机帮助页.

由于某些可怕的原因,这些联机帮助页被维护为文本文件,这些文件将由我迅速安装的AsciiDoc程序处理.但是AsciiDoc将这些文本文件转换为XML.

然后Git使用另一个名为xmlto的程序将AsciiDoc吐出的XML转换为联机帮助页(我想 - 我还没有那么远).问题是每当它开始该步骤时我都会收到此错误(第一行是从make输出,其余是错误):

    XMLTO git-apply.1
I/O error : Attempt to load network entity http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd
/Users/chrislutz/prog/sources/git-1.6.3.1/Documentation/git-apply.xml:2: warning: failed to load external entity "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
D DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"
Run Code Online (Sandbox Code Playgroud)

所以基本上它只是遍历每个文件并给我所有这些错误.

我曾尝试过一次下载文件http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd,将其放在目录中,然后将XML文件中的所有引用更改为目录中的文件,但这给了我更多更奇怪的错误.如果我有一个常规的工作解决方案,它可能仍然会给我那些陌生人的错误,这意味着整个事情被搞砸了,我将只使用谷歌安装程序.

然而,我自己已经(跌跌撞撞)得到了这一点,我觉得这是松一口气和使用Git的机会之前的最后一步.所以我想做出最后的努力来理解什么是错的.而"最后努力"意味着"Ask Stack Overflow".

因此,如果有人能够让我对这个错误意味着什么以及为什么会发生错误(以及我可以做些什么来修复它)有任何见解,那就太棒了.如果没有,我会尝试使用Google安装程序.

git macos version-control

14
推荐指数
2
解决办法
8169
查看次数

使用php计算字符串中大写字母的最简单,最短的方法?

我正在寻找最短,最简单和最优雅的方法来计算给定字符串中的大写字母数.

php count letters

14
推荐指数
3
解决办法
9827
查看次数