为数组使用动态内存分配

我怎么应该为数组使用动态内存分配? 例如,下面是一个数组,其中我从.txt文件中读取单个单词并在数组中逐字保存: 码: char words[1000][15]; 这里1000定义了数组可以保存的单词数,每个单词可以包含不超过15个字符。 现在我希望该程序应该为它计算的单词数量动态分配内存。 例如,.txt文件可能包含大于1000的单词。现在我希望程序应该计算单词数并相应地分配内存。 由于我们不能使用变量代替[1000],因此我对如何实现逻辑完全空白。 请帮助我这方面。

popen()替代方案

我的问题是这个问题的延伸: popen创造了一个额外的过程 动机: 1)我的程序需要创建一个在文件上tail的子项。 我需要逐行处理输出。 这就是为什么我使用popen因为它返回FILE *。 我可以轻松获取单行,执行我需要做的操作并打印它。 popen的一个问题是你没有得到孩子的pid(在我的情况下是tail命令)。 2)我的程序不应该在孩子完成之前退出。 所以我需要wait ; 但没有pid,我不能这样做。 我怎样才能实现这两个目标? 一个可能的(kludge)解决方案:执行execvp(“tail -f file> tmpfile”)并继续读取tmpfile。 不过,我不确定这个解决方案有多好。

如何在C中打印内存地址

我的代码是: #include #include void main() { char string[10]; int A = -73; unsigned int B = 31337; strcpy(string, “sample”); // printing with different formats printf(“[A] Dec: %d, Hex: %x, Unsigned: %u\n”, A,A,A); printf(“[B] Dec: %d, Hex: %x, Unsigned: %u\n”, B,B,B); printf(“[field width on B] 3: ‘%3u’, 10: ‘%10u’, ‘%08u’\n”, B,B,B); // Example of unary address […]

fork()如何工作?

我真的很新的分叉,这个代码中的pid做了什么? 有人可以解释一下X行和Y行的内容吗? #include #include #include #define SIZE 5 int nums[SIZE] = {0,1,2,3,4}; int main() { int i; pid_t pid; pid = fork(); if (pid == 0) { for (i = 0; i 0) { wait(NULL); for (i = 0; i < SIZE; i++) printf("PARENT: %d ",nums[i]); /* LINE Y */ } return 0; }

在c:func(void)与func()

当C函数不接受任何参数时,是否必须通过语言规则使用“void”参数声明/定义它? 当参数列表中没有任何内容时,PC-Lint似乎有问题,我想知道它是否是我不知道的语言语法中的东西。 编辑:我刚刚发现了一个重复的(后面的傻瓜?它首先出现)问题, C void参数 ,它有更多的答案和解释。

C读二进制stdin

我正在尝试构建一个指令管道模拟器,我在开始时遇到了很多麻烦。 我需要做的是从stdin读取二进制文件,然后在操作数据时以某种方式将其存储在内存中。 我需要一个接一个地读取正好32位的块。 我如何一次读取正好32位的块? 其次,我如何存储它以便以后操作? 这是我到目前为止所做的,但是检查我进一步阅读的二进制块,它看起来不正确,我不认为我正在读取我需要的32位。 char buffer[4] = { 0 }; // initialize to 0 unsigned long c = 0; int bytesize = 4; // read in 32 bits while (fgets(buffer, bytesize, stdin)) { memcpy(&c, buffer, bytesize); // copy the data to a more usable structure for bit manipulation later // more stuff buffer[0] […]

宏中的#和##

#include #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf(“%s\n”,h(f(1,2))); printf(“%s\n”,g(f(1,2))); return 0; } 只需通过查看程序,“可能”期望输出,对于两个printf语句都是相同的。 但是在运行程序时,你会得到它: bash$ ./a.out 12 f(1,2) bash$ 为什么会这样?

在C中,给定变量参数列表,如何使用它们构建函数调用?

假设有一个以某种方式存储的参数列表,例如,在数组中。 给定一个函数指针 ,如何调用它来传递存储的参数列表? 我不是试图将数组作为参数传递好。 你明白了,好吗? 我想将每个元素作为参数传递。 数组只是为了说明,我可以将参数存储在一些元组结构中。 另外,看看我手头有一个函数指针,并且可能有字符串格式的签名 。 我不是只想定义一个能够处理可变列表的函数。 我看到如何做到这一点的唯一方法是使用汇编(通过__asm push et al。)或者: void (*f)(…); int main() { f = ; int args[]; int num_args = ; switch(num_args) { case 0: f(); break; case 1: f(args[0]); break; case 2: f(args[0], args[1]); break; /* etc */ } return 0; } 我不太喜欢这种做法…… 还有另一种便携式和更短的forms吗? 几种脚本语言可以调用C函数。 Python或Ruby等脚本语言如何做到这一点? 他们如何以便携方式实现它? […]

检查指针是否指向堆上已分配的内存

我想知道指针是否指向一个用malloc / new分配的内存。 我意识到任意地址的答案是“不,你不能”,但我认为可以覆盖malloc / free并跟踪分配的内存范围。 您是否知道提供此特定工具的内存管理库? 你知道生产代码的东西吗? Valgrind很棒,但是仪表太多了(慢)并且Will说我们不想像这样使用Valgrind(使软碰撞变得足够好)。 Mudflap是一个非常好的解决方案,但是专门用于GCC,遗憾的是,检查不会简单地返回布尔值(请参阅下面的答案)。 请注意,检查内存写入是否合法是一个安全问题 。 所以寻找表现是有动力的。

存储在二进制文件中的int不成功fread(),分段错误

似乎有10个问题的顺序和(大多数)成功的答案解决因C中误用的fread()导致的分段错误。尽管如此,我遇到了这样的问题,但还没有找到解决方案。 我有一个二进制文件,包含一个int (称为nbins )和一个float数组(大小为nbins )。 当我尝试读取此文件时,它会成功打开并指向文件句柄,但在读取nbins int时会出现分段错误错误。 这是一个最小的例子: #include #include #include #define BPATH “/path/to/file” int main(int agrc, char **argv) { FILE *fd; int num; char fname[500]={}; int nbins; float *coords; num = 5; sprintf(fname,”%s/file%d.dat”, BPATH, num); if(!(fd=fopen(fname,”rb”))) { printf(“Can’t open file: %s\n\n”,fname); exit(0); } printf(“Reading input file:\n”); printf(“%p: %s\n”, fd, fname); // prints successfully fread(&nbins, […]