这是一段简短的代码片段,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)
提前致谢!
报价:
测试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) 他们说,从我读过的所有资料来看,偷看和流行之间的区别在于偷看并没有消除最高价值.在我的讲义中提供的例子中,显然他们使用不同的减法方法做同样的事情.两个操作后顶部减去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) 我回到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讲义中发现了这样一句话.
我无法发明任何证明这句话的例子.
在我看来,每一个赋值操作都会被评估一次,因为当我们想要对它进行多次评估时,我们会在循环中进行评估.我错过了什么?
我已经搜索过,但在SO上找不到答案.
正如标题所说,在我的程序中,我(经过许多程序后)得到标记词。不幸的是,由于颠倒了它们,它们在单词的开头保留了标点符号,例如。,驼鹿
如何,
从头到尾移动->驼鹿,
到目前为止,我已经尝试过(ptr
是char *
):
temp = strdup(ptr);
temp = &ptr[0];
ptr[0] = ptr[1];
ptr[strlen(ptr)-1] = temp;
free(temp);
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
赋值使指针来自整数而不进行强制转换
警告:赋值从指针生成整数而不进行强制转换
如何解决?
这是一个功能阅读线的简短片段.这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) 从定义 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
吗?