小编Pet*_*rba的帖子

在_SUCCESS和_FAILURE上退出()释放分配的内存

这是一段简短的代码片段,exit(3)在发生故障时会有两次调用.这些调用是否释放malloc分配的内存?谷歌搜索曾经说过它,甚至更多次,它没有......

我应该添加free()吗?

另外:哪个更好if (!word)(它也适用于例如.word == 0,这与word == NULL不同,所以我猜它是错的)或者if (word == NULL)

char *word = NULL, *temp = NULL;
    word = (char *)malloc(sizeof(char) * size);

    if (!word) {            /* or maybe rather it should be (word == NULL)  */
        perror("malloc fail");
        if (fclose(fp)) {
            perror("fclose fail");
            exit(3);                            /* exit without free ? */
        }
        exit(3);                                /* exit without free ? */
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢!

c malloc free exit

11
推荐指数
2
解决办法
6950
查看次数

不确定K&R中句子的正确性 - 指针算术| 解放程序

报价:

测试if(allocbuf + ALLOCSIZE - allocp> = n){检查是否有足够的空间来满足n个字符的请求.如果存在,allocp的新值最多只能超出allocbuf的末尾.

与之相关的代码:

#define ALLOCSIZE 10000 /* size of available space */
static char allocbuf[ALLOCSIZE]; /* storage for alloc */
static char *allocp = allocbuf; /* next free position */

char *alloc(int n)
/* return pointer to n characters */
{
    if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */
        allocp += n;
        return allocp - n; /* old p */
    } else
/* not enough room */
        return 0; …
Run Code Online (Sandbox Code Playgroud)

c pointers kernighan-and-ritchie

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

在那种情况下流行和偷看做同样的事情?

他们说,从我读过的所有资料来看,偷看和流行之间的区别在于偷看并没有消除最高价值.在我的讲义中提供的例子中,显然他们使用不同的减法方法做同样的事情.两个操作后顶部减去1.

我对吗?可能不是,有人可以解释这些有何不同?

int pop(void)
{
    assert(top>0);
    return data[--top];
}
int peek(void)
{
    assert(top>0);
    return data[top-1];
}
Run Code Online (Sandbox Code Playgroud)

c stack peek

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

二叉树元素的递归printf

我回到K&R是为了阅读一章,并注意到我之前省略的一个例子.本章介绍二叉树数据类型的主题.我知道在节点中存储新条目,但打印功能让我感到困惑.为什么首先打印左侧部分?

如果它printf是功能中的第一个命令,其次是左和右,它会工作吗?

如果没有 - 为什么呢?

/* treeprint: in-order print of tree p */
void treeprint(struct tnode *p)
{
    if (p != NULL) {
        treeprint(p->left);
        printf("%4d %s\n", p->count, p->word);
        treeprint(p->right);
    }
}
Run Code Online (Sandbox Code Playgroud)

c binary-tree kernighan-and-ritchie

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

算术赋值运算符 - 左侧仅计算一次

正如标题所说,我在一些C讲义中发现了这样一句话.

我无法发明任何证明这句话的例子.

在我看来,每一个赋值操作都会被评估一次,因为当我们想要对它进行多次评估时,我们会在循环中进行评估.我错过了什么?

我已经搜索过,但在SO上找不到答案.

c variable-assignment

3
推荐指数
1
解决办法
946
查看次数

如何从头到尾移动字符串中的字符

正如标题所说,在我的程序中,我(经过许多程序后)得到标记词。不幸的是,由于颠倒了它们,它们在单词的开头保留了标点符号,例如。,驼鹿

如何,从头到尾移动->驼鹿,

到目前为止,我已经尝试过(ptrchar *):

temp = strdup(ptr);
temp = &ptr[0];
ptr[0] = ptr[1];
ptr[strlen(ptr)-1] = temp;
free(temp);
Run Code Online (Sandbox Code Playgroud)

但这给了我错误:

赋值使指针来自整数而不进行强制转换

警告:赋值从指针生成整数而不进行强制转换

如何解决?

c pointers

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

size_t用作公式中的值

这是一个功能阅读线的简短片段.这bufsize与它相比((size_t)-1)/2有何可能?

我想象将变量与例如比较.int - 这是不可能的; 相反,INT_MAX是正确的,我想.那么该代码如何实际工作并且不会出错?

int c;
size_t bufsize = 0;
size_t size = 0;

while((c=fgetc(infile)) != EOF) {
    if (size >= bufsize) {
        if (bufsize == 0)
                bufsize = 2;
        else if (bufsize <= ((size_t)-1)/2)
                bufsize = 2*size;
        else {
                free(line);
                exit(3);
        }
        newbuf = realloc(line,bufsize);
        if (!newbuf) {
                free(line);
                abort();
        }
        line = newbuf;
    }
    /* some other operations */
}
Run Code Online (Sandbox Code Playgroud)

c size-t

0
推荐指数
1
解决办法
1351
查看次数

strtod定义和传递指针的类型

从定义 double strtod ( const char * str, char ** endptr );

C参考站点提供了强大功能的示例:

char szOrbits[] = "365.24 29.53";
char * pEnd;
double d1, d2;
d1 = strtod (szOrbits,&pEnd);
d2 = strtod (pEnd,NULL);
Run Code Online (Sandbox Code Playgroud)

如果endptr应该是类型char **为什么char *pEnd在这里使用?不是char **pEnd吗?

c strtod

0
推荐指数
1
解决办法
185
查看次数