当我们使用malloc()分配内存时,我们应该给出两个幂的大小吗?或者我们只是给出我们需要的确切尺寸?
喜欢
//char *ptr= malloc( 200 );
char *ptr= malloc( 256 );//instead of 200 we use 256
Run Code Online (Sandbox Code Playgroud)
如果给出2的幂的大小更好,那是什么原因?为什么更好?
谢谢
编辑
我混淆的原因是在Joel的博客Back to Basics中引用
智能程序员通过始终分配大小为2的内存块来最小化malloc的潜在破坏.你知道,4个字节,8个字节,16个字节,18446744073709551616个字节等.由于任何使用乐高的人都应该直观的原因,这可以最大限度地减少自由链中发生的奇怪碎片的数量.虽然看起来这似乎浪费了空间,但也很容易看出它永远不会浪费50%以上的空间.所以你的程序使用的内存不会超过它需要的两倍,这不是什么大不了的事.
对不起,我应该早点发布上面的报价.我很抱歉!
到目前为止,大多数回复都说,以2的力量分配内存是一个坏主意,那么在哪种情况下更好地遵循Joel的观点malloc()呢?他为什么这么说?以上引用的建议现在已经过时了吗?
请解释一下.
谢谢
我尝试了以下脚本
#!/bin/bash
var1="Test 1"
var2="Test 2"
if [ "$var1"="$var2" ]
then
echo "Equal"
else
echo "Not equal"
fi
Run Code Online (Sandbox Code Playgroud)
它给了我Equal.虽然它应该印刷Not equal
只有当我在=其周围插入空间时才能按预期工作
if [ "$var1" = "$var2" ]
Run Code Online (Sandbox Code Playgroud)
并打印 Not equal
为什么会这样?为什么"$var1"="$var2"不一样"$var1" = "$var2"?
而且,当我写作时if [ "$var1"= "$var2" ],它给了
line 4: [: Test 1=: unary operator expected
Run Code Online (Sandbox Code Playgroud)
它是什么意思?它如何期待一元运算符?
从命令行向main()传递参数我所理解的是argc的最小值为1,而argv [0]将始终具有程序名称及其路径.
如果在命令行提供了参数,那么argc的值将大于1,而argv [argc-1]的argv将具有这些参数.
argv [0]将是包含程序名称的字符串,如果不可用,则为空字符串.
现在,argv [0]如何以及何时可以使用空字符串?我的意思是程序名称及其路径将始终可用,所以什么时候它可以为空?
作家说"如果不可用"但是何时以及如何可能无法获得该计划名称?
我有一个git repo,它有以下文件夹:
_includes/
_layouts/
_plugins/
_posts/
_site/
Run Code Online (Sandbox Code Playgroud)
_site文件夹已添加到.gitignore文件中.
现在,我可以在_site文件夹中使用不同的远程仓库进行推送和拉取的git repo吗?会有冲突吗?
我已经研究过git子模块,但我认为如果上述方法可行,那么在我的情况下这将是一种矫枉过正.
最近,我用几乎所有的练习和例子读完了K&R.我打算转到"加速C++",我遇到了Axel Schreiner用ANSI-C 编写的 OOP 书.
我很好奇,想要学习它.但是在投入时间之前,我想知道在C中实施OOP的价值.这样我就可以决定花多少时间在它上面.
我认为我在这里提到我的背景是合适的,这样你们就可以更好地指导我了.我大约一年前完成了C,C++,Java和OOP理论,也找到了工作.但是后来Joel的博客和SO让我意识到我缺少很多东西.所以我再次拿起书,开始正确研究它们.
K&R,Accelerated C++,C++算法和其他一些书籍是我努力提高自己的技能.我不是OOP的新手.
那么你会建议什么?
谢谢你的时间.
让我们说我们有一个char指针数组
char* array[] = { "abc", "def" };
Run Code Online (Sandbox Code Playgroud)
那到底应该放什么?
char* array[] = { "abc", "def", '\0' };
Run Code Online (Sandbox Code Playgroud)
要么
char* array[] = { "abc", "def", "\0" };
Run Code Online (Sandbox Code Playgroud)
虽然,两者都有效.我们只需要对条件进行相应的检查
喜欢
array[ index ] != '\0';
Run Code Online (Sandbox Code Playgroud)
要么
array[ index ] != "\0";
Run Code Online (Sandbox Code Playgroud)
我的问题是哪一个更好?大多数程序员使用哪种?
编辑
大多数答案都说NULL优于'\ 0'和"\ 0".但我一直都这么认为
NULL与'\ 0'相同,它与0x0或0相同
这是错的吗?
我一直在Linux平台上担任C开发人员.最近完成了K&R并做了一点关于在C中实现OOP的研究.除此之外我还研究过C++和Java.所有这些都在Linux平台上.
现在我打算学习LISP.我已经通过LISP讨论针对SO的初学者,特别是学习LISP的最佳方式是什么.
我理解,从程序化到功能性编程范式的转变是一个重大举措.从新范式的角度思考将是真正的挑战.就像我第一次学习OOP时那样.
这是我真正担心的范例.当我开始OOP时,大部分时间用于学习如何根据OOP查看问题.语法并不难理解.
现在,我一直在C工作,我目前在我工作场所的项目也在C中.我担心如何才能学会在函数式编程方面查看问题.
谢谢你的时间.任何帮助和建议将不胜感激.
它在ftok()手册中提到过
key_t ftok(const char *pathname, int proj_id);
Run Code Online (Sandbox Code Playgroud)
ftok()函数使用由给定路径名命名的文件的标识(必须引用现有的可访问文件) ...
我很困惑const char *pathname.
它最好的做法是什么?在我当前的系统上,我可以通过"/home/Andrew/anyfile"但是我的程序必须运行的其他系统不可能拥有此文件.
我如何使用"/etc/hosts/"或"/etc/inittab"因为我确定所有这些系统都有这两个文件?这是个好主意吗?它会引起任何问题吗?
我不想要求用户在执行时输入文件名或将文件名作为命令行参数传递.
还有其他不同的更好的方法来决定pathname吗?
哪种方式最好,最可靠?
谢谢你的时间.
好吧,我有一个文件test.txt
#test.txt odsdsdoddf112 test1_for_grep dad23392eeedJ test2 for grep Hello World test garbage
我想提取后面有空格的字符串.我使用了以下表达式并且它有效
grep -o [[:alnum:]]*.[[:blank:]] test.txt
它的输出是
odsdsdoddf112 dad23392eeedJ test2 for Hello World
但问题是grep会打印出所有带有空格的字符串,我希望它在第一次匹配后停止,然后进入第二行.
我应该在这里使用哪个表达式,以便在第一次匹配后停止并移至下一行?
这个问题可以通过gawk或其他工具解决,但我将欣赏一个仅使用grep的解决方案.
编辑 我在Linux系统上使用GNU grep 2.5.1,如果这是相关的.
编辑
在下面给出的答案的帮助下,我试着运气
grep -o ^[[:alnum:]]* test.txt grep -Eo ^[[:alnum:]]+ test.txt
两个人都给了我正确的答案.
现在令我惊讶的是我尝试过使用
grep -Eo "^[[:alnum:]]+[[:blank:]]" test.txt
正如这里建议但没有得到正确的答案.这是我终端上的输出
odsdsdoddf112 dad23392eeedJ test2 for Hello World
但RichieHindle和Adrian Pronk的评论显示他们的系统输出正确.任何人都知道为什么我也没有在我的系统上得到相同的结果.任何的想法?任何帮助将不胜感激.
编辑
好吧,似乎grep 2.5.1有一些bug,因为我的输出不正确.我安装了grep 2.5.4,现在它正常工作.有关详细信息,请参阅此链接.
我传递了一个指向ptr函数的指针,该函数的原型将其作为const.
foo( const char *str );
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这意味着它将无法改变ptr传递的内容.就像在的情况一样foo( const int i ).如果foo()尝试更新值i,编译器会给出错误.
但在这里我看到它可以ptr轻松改变内容.
请查看以下代码
foo( const char *str )
{
strcpy( str, "ABC" ) ;
printf( "%s(): %s\n" , __func__ , str ) ;
}
main()
{
char ptr[ ] = "Its just to fill the space" ;
printf( "%s(): %s\n" , __func__ , ptr ) ;
foo( const ptr ) ;
printf( "%s(): %s\n" , __func__ …Run Code Online (Sandbox Code Playgroud)