我正在编写一个计算两个数字的最大公分母的程序,但是我遇到了malloc函数和指针的问题。 实际上很清楚堆栈和堆段如何在内存中工作以及原因。 但是,在程序中,在声明指针并且使用mallocfunction与否时,我还无法理解。 这是代码: #include #include #include int *calcolaDivisori(int); int main(int argc, char** argv) { int foundCounter = 0; int i,j,s1,s2; int n1,n2; int mcd = 1,mcm; int *pn1,*pn2; int d1[100],d2[100]; // INPUT dei due interi printf(“Inserisci il primo numero :”); scanf(” %d”, &n1); printf(“\nInserisci il secondo numero :”); scanf(” %d”, &n2); // calcolo divisori […]
void*总是与char*具有相同的表示吗? 细节: 我想使用一个可变参数函数,它使char *被一个(char*)0终止,如下所示: int variadic(char*, …); //<-prototype variadic("foo", "bar", (char*)0); //<- usage 我想用NULL替换(char*)0 ,但是从http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf来判断: 66)宏NULL在(和其他头部)中定义为空指针常量; 见7.19。 3值为0的整型常量表达式或类型为void *的表达式称为空指针常量。 66)如果将空指针常量转换为指针类型,则保证将结果指针(称为空指针)与指向任何对象或函数的指针进行比较。 我不能,因为在variadic上下文中,我绝对需要一个char*和一个普通的0是不可接受的。 如果我定义: #define NIL (void*)0 /*<= never a plain 0*/ 用它来终止我的variadic(char*,…)对我来说是否合法?
我已经读过将函数指针转换为数据指针,反之亦然,在大多数平台上都能正常工作,但不保证能够正常工作。 为什么会这样? 两者都不应该只是简单地存入主存储器,因此兼容吗?
我正在创建一个包含缓冲区function的源文件,我想用于我正在创建的其他库。 它工作正常但我无法摆脱我在其中一个函数中创建的缓冲区结构。 以下片段应该有助于说明我的问题: C头: //dbuffer.h … typedef struct{ char *pStorage; int *pPosition; int next_position; int number_of_strings; int total_size; }DBUFF; … C源: //dbuffer.c … DBUFF* dbuffer_init(char *init_pArray) { //Find out how many elements the array contains int size = sizeof_pArray(init_pArray); //Initialize buffer structure DBUFF *buffer = malloc(sizeof(DBUFF)); //Initialize the storage buffer->pStorage = malloc( (sizeof(char)) * (size) […]
当分配到void -pointer或从void -pointer分配时,不需要强制转换(C99§6.3.2.2sub 1/§6.5.16.1sub 1)。 将(例如int – )指针传递给需要void -pointer的函数时,这也是正确的吗? 例如: void foo(void * p){ // Do something } int main(){ int i = 12; foo(&i); // int * to void *: no cast needed? } 当我使用GCC(4.8.1,MinGW-32)编译它时,我既没有错误也没有警告(使用-Wall & -pedantic )。 与此答案相反,建议此调用需要-Wformat (消除-Wformat警告): int main(){ int i = 12; printf(“%p\n”, &i); } 但就我而言,海湾合作委员会并没有抱怨。 那么:将非void -pointer传递给需要void -pointer的函数时需要进行强制转换?
我有一个2D数组指针 main.c Int32 * pRxSeqAddr[2][2]; func(pRxSeqAddr); / func.c void func( Int32** pRxSeqAddrPtr) { /// } 我收到此错误: argument of type “Int32 *(*)[2]” is incompatible with parameter of type “Int32 ** 我知道如果它是指针的1D数组那么这个函数调用很好,但是2D唠叨我… 请帮忙
只是为了好玩,我有一个const char*的std::list ,每个元素指向一个以null结尾的文本字符串,并在其上运行std::list::sort() 。 碰巧的是,它(没有双关语意)没有对字符串进行排序。 考虑到它正在使用指针,这是有道理的。 根据std::list::sort()的文档 ,它(默认情况下)使用operator <在元素之间进行比较。 暂时忘记这个列表,我的实际问题是:这些(>, =,<=)运算符如何处理C ++和C中的指针? 他们只是比较实际的内存地址吗? char* p1 = (char*) 0xDAB0BC47; char* p2 = (char*) 0xBABEC475; 例如,在32位小端系统上, p1 > p2因为0xDAB0BC47 > 0xBABEC475 ? 测试似乎证实了这一点,但我认为将它放在StackOverflow上以供将来参考是件好事。 C和C ++都对指针做了一些奇怪的事情 ,所以你真的不知道……
假设一个函数返回一个固定的“随机文本”字符串就像 char *Function1() { return “Some text”; } 如果它意外地试图改变价值,程序可能会崩溃 Function1()[1]=’a’; 函数调用尝试执行此操作后的方括号会导致程序崩溃吗? 如果您对此很熟悉,我们将非常感谢您的解释!
可能重复: 为什么我不能在C中将’char **’转换为’const char * const *’? 我很好奇,为什么我不能将char **传递给const char **函数? 在将char *传递给const char *函数的情况下,用双指针执行它似乎不行。 我认为添加constness总是可以的(但不能删除常量)但现在看来我错了。 Gcc编译器给我错误的错误: note: expected ‘const char **’ but argument is of type ‘char **’ 这是代码片段: int f(const char **a) { } int main() { char *a; f(&a); } 有任何想法吗?
根据我的理解,因为malloc动态分配mem,你需要释放该mem以便它可以再次使用。 如果你返回一个使用malloc创建的char *会发生什么(即你应该如何释放它) 如果您将指针保持原样并退出应用程序将被释放。(我无法找到明确的答案,有些人说是,有些人说没有)。