你是否应该self在Python中引用成员函数时使用(在同一模块中)?
更一般地说,我想知道什么时候需要使用self,不仅仅是方法,还有变量.
在计算机网络中 - 实际上在很多其他领域 - 我听到很多关于术语"阻塞","非阻塞","同步"和"异步"的引用.我想知道是否有人能用非常直接/简单的术语解释这些意味着什么?
我目前不得不编写malloc()和free()的实现,并给出了一个驱动程序,它将运行我的两个实现.
但是目前,我是segfaulting,因为free()试图释放数十亿字节(这是错误的)有效载荷大小.我有运行GDB的行号和行号,但我需要知道malloc()和free()是否被多次调用,以确认至少有一个案例它运行顺利.
这实际上是一个比我在这里问过(任何谁在乎)一个更简洁,更清晰的问题:C语言中:为什么malloc()函数返回一个指针,而不是价值?(对不起那些最初认为我是垃圾邮件的人...我希望它不会被解释为同一个问题,因为我认为我在那里的措辞使得它无意中误导了)
- >基本上我要问的是:为什么C程序员需要一个指向动态分配的变量/对象的指针?(无论变量/对象之间有什么区别......)
如果C程序员可以选择只创建'int x'或者只是'int*x'(两者都是静态分配的),那么为什么他也不能选择JUST将其动态分配的变量/对象初始化为变量(并且不通过malloc()返回指针)?
*如果有一些模糊的方法来做我上面解释的那么,那么,为什么malloc()似乎是大多数教科书关于动态分配的方式?
假设你有:
void *p = // something;
int size = 10;
*((char *)p + 8) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)
我知道这看起来像是随机的逻辑,但我想知道它是否仍然按预期进行.当p被转换为char时,我试图将"size ^ 1"的整体放在"p + 8"指向的地址处.基本上我要问的是,它有什么不同:
*((int *)p + 2) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)
此外,如果我选择将指针增加3,会发生什么,例如:
*((char *)p + 3) = size ^ 1;
Run Code Online (Sandbox Code Playgroud)
或(我知道这不等于所有其他人,但想看看这是否正确):
*((int *)p + 3) = size ^ 1;
Run Code Online (Sandbox Code Playgroud) 我目前(不要问为什么:P)实现我自己的malloc()和free()版本,并故意在free()的第一行放置一个断言(0)以用于当前的调试目的.
驱动程序正在测试这些malloc()和free()的随机序列,以测试我的实现的正确性.
但是,当我运行驱动程序时,shell会打印出"Assertion'0'失败",继续运行一段时间,然后打印"Aborted".实际上,看起来它甚至可以在报告断言失败之间多次调用malloc(),然后最终报告程序已中止.我确信这是因为我在代码中放置了某些printf语句以打印出某些变量用于调试目的.
我并没有要求任何关于实现malloc()和free()的帮助.只想在程序报告失败后,即使程序似乎继续运行一小段时间(甚至可能调用其他用户定义的函数),也只是想知道什么意思.
根据我对C的理解,似乎你应该在尝试初始化时使用malloc(大小),例如,一个直到运行时才知道其大小的数组.
但我想知道为什么函数malloc()返回一个指向变量位置的指针以及为什么你甚至需要它.
基本上,为什么C不会将它全部隐藏起来,所以每当你做这样的事情时:
// 'n' gets stdin'ed from the user
...
int someArray[n];
for(int i = 0; i < n; i++)
someArray[i] = 5;
Run Code Online (Sandbox Code Playgroud)
你可以在不必调用malloc()或其他函数的情况下完成它吗?其他语言是这样做的(通过完全隐藏内存属性/位置)吗?我觉得作为一个初学者,处理你使用的变量的内存位置的整个过程只会让程序员感到困惑(而且由于其他语言不使用它,C似乎做了一个简单的初始化过程,比如过于复杂)......
基本上,我想要问的是为什么malloc()甚至是必要的,因为为什么语言不会在内部处理所有这些,而程序员不必担心或不得不看内存.谢谢
*编辑:好的,也许有一些我不知道的C版本允许你放弃使用malloc()但是让我们暂时忽略它...
假设你从一个void指针,一个char指针,一个int指针,或者你想要命名的任何东西开始.
void *p = // initialized to something here
Run Code Online (Sandbox Code Playgroud)
我们做转换就像
*((int *)((char *)p + 6)) = 5;
Run Code Online (Sandbox Code Playgroud)
这是否意味着我们基本上是一个指向char指针的void指针,做一些算术运算,将它转换为int指针,然后将它取消引用到存储5?
或者我们是否需要将char指针强制转换回void指针,然后才能将其强制转换为int指针?
*另外,在从char*转换为int*之前,是否需要在转换之前的某处取消引用?
我只是想知道是否有一些"标准"示例,每个人都用它来解释需要Hash表的问题的本质.现实世界中有哪些众所周知的问题可以从使用哈希表中获得巨大好处?
*编辑:还有一些背景或解释为什么问题的性质有利于哈希表会有所帮助!谢谢
我有时会在其他人的代码中看到这个:
public void *foo() {
...
}
public void bar() {
...
}
Run Code Online (Sandbox Code Playgroud)
但我从来不明白这是什么意思*,如果public void *foo()和之间有任何区别public void foo()?
***这是这里的C++代码!
假设您已经定义了一个(全局或局部)指针变量,例如:
void *this_is_a_pointer;
Run Code Online (Sandbox Code Playgroud)
没有给它值"= NULL;"
这会自动给你一个NULL ptr(一个指向NULL的指针)吗?
*另外,空指针指向NULL意味着什么?这是说它可以指向字面上的任何地方吗?(基本上,什么是" NULL的地址位置"?)
假设你有:
void *a = //some address;
*((int **)(char*)a) = 5
Run Code Online (Sandbox Code Playgroud)
我不清楚第二行应该做什么...我知道'a'被转换为指向char的指针,然后最终被转换为指向int的指针,但它目前还不清楚是什么解除引用指向int实际指针的指针...
这将非常有帮助.谢谢
假设您有一个"void*a"和"void*ptr",它指向代码中定义的不同地址.然后我想知道这两条线是否相同且功能相同?
*((unsigned **)((char*)ptr+4)) = a;
Run Code Online (Sandbox Code Playgroud)
和
*((unsigned *)((char*)ptr+4)) = a;
Run Code Online (Sandbox Code Playgroud)
第二个抛出一个警告,"赋值从没有强制转换的指针生成整数"
另外,它是否也与上述相同?:
*((char*)ptr+4) = a;
Run Code Online (Sandbox Code Playgroud)