小编1de*_*der的帖子

C全局非大小数组?

我们有一个学校项目,任何使用C的信息系统.为了保留动态大小的学生记录列表,我选择了一个链表数据结构.今天早上我的朋友让我看看他的系统.我对他的记录清单感到惊讶:

#include <stdio.h>
/* and the rest of the includes */

/* global unsized array */
int array[];

int main()
{
    int n;
    for (n=0; n < 5; n ++) {
         array[n] = n;
    }


    for (n=0; n < 5; n ++) {
         printf("array[%d] = %d\n", n, array[n]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

与代码一样,他声明了一个未整理的数组,它是整个程序的全局(在bss段中).他能够通过用非零值的值覆盖后续的内存块来为数组添加新条目,这样他就可以遍历数组:

for (n=0; array[n]; n++) {
    /* do something */
}
Run Code Online (Sandbox Code Playgroud)

他用过(我也用它测试过)Turbo C v1.我在linux中尝试过它也可以.

由于我之前从未遇到过这种技术,我认为它存在问题.所以,是的,我想知道为什么这是一个坏主意,为什么更喜欢这个链接列表.

c arrays linked-list

6
推荐指数
1
解决办法
3432
查看次数

如何跟踪系统调用的进程?

我正在尝试编写一个跟踪系统调用的程序.我很难完成这项工作.我尝试调用fork()来创建自己的实例(代码),然后监视生成的子进程.

目标是父进程返回子进程进行的每个系统调用的索引并将其输出到屏幕.不知何故,它没有按计划运作.

这是代码:

#include <unistd.h>     /* for read(), write(), close(), fork() */
#include <fcntl.h>      /* for open() */
#include <stdio.h>
#include <sys/ptrace.h>
#include <sys/reg.h>
#include <sys/wait.h>
#include <sys/types.h>


int main(int argc, char *argv[]) {
    pid_t child;
    long orig_eax;
    child = fork();

    if (0 == child) 
    {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        if (argc != 3) {
           fprintf(stderr, "Usage: copy <filefrom> <fileto>\n"); 
           return 1;
        }

        int c;
        size_t file1_fd, file2_fd; 
        if ((file1_fd = open(argv[1], O_RDONLY)) < 0) {
           fprintf(stderr, "copy: can't open …
Run Code Online (Sandbox Code Playgroud)

c linux ptrace system-calls

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

K&R malloc代码没有意义?

此代码来自K&R书籍 - 第8章第7节:示例 - 存储分配器.至少对我来说,这段代码没有意义."Header"是结构和"限制性最强的对齐类型"的并集,它是一种long类型.然后,Malloc将找到一个足够大的可用空间,其大小为标题大小的倍数.

static Header base;            /* empty list to get started */
static Header *freep = NULL;   /* start of free list */

/* malloc: general-purpose storage allocator */
void *malloc(unsigned nbytes)
{
  Header *p, *prevp;
  Header *morecore(unsigned);
  unsigned nunits;
  nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1;
  if ((prevp = freep) == NULL) {     /* no free list yet */
    base.s.ptr = freeptr = prevptr = &base;
    base.s.size = 0;
  }
  for (p = prevp->s.ptr; ; prevp = p, …
Run Code Online (Sandbox Code Playgroud)

c malloc kernighan-and-ritchie

4
推荐指数
1
解决办法
2617
查看次数

为什么分配刚刚声明的类变量是非法的?

class A {
    public int someVar;
    someVar = 123;      /* cannot find symbol */
}
Run Code Online (Sandbox Code Playgroud)

为什么语言不能看到我刚刚声明的变量?这对Java来说是独一无二的,或者在所有有类OOP语言中都是如此吗?

java oop class

1
推荐指数
2
解决办法
184
查看次数