退出前我应该释放内存吗?

因错误而退出程序时,我应该释放所有我的mallocated内存吗? something = (char**) malloc (x * sizeof(char*)); for (i = 0; i < x; i++) something[i] = (char*) malloc (y + 1); … if (anything == NULL) { printf("Your input is wrong!"); // should I free memory of every mallocated entity now? exit(1); } else { // work with mallocated entities … free(something); // […]

printf参数不足

我的问题是关于缺少参数的printf之后的行为: printf(“%s blah blah %d”, int); // integer was given as argument (and not int written) 我已经知道如果格式的参数不足,则行为未定义。 问题是printf结果或整个程序是否未定义? 当%s试图从未经授权的内存地址读取时,可能会发生崩溃。 (它发生在我身上) printf完成后会发生崩溃吗? (打印一些垃圾字符串和整数) 编辑: 澄清我不是在询问编译错误或警告,执行此行时程序也不会崩溃。 问题是这行可以使程序在此行已经执行后随机崩溃。

为什么要在C和C ++中避免使用system()函数?

我在论坛上看到很多人告诉他们避免使用system()函数,比如system(“cls”) 。 我不明白为什么。 请告诉我为什么要避免这个function。 而且,由于clrscr()不能与CodeBlocks一起使用,有什么其他方法可以在不使用system()函数的情况下清除屏幕?

C中的无符号hex常量?

C是否处理hex常量(例如0x23FE)和有符号或无符号的int?

如何通过指针处理矩阵中的子矩阵?

我有一个大小为n的矩阵。 举个例子: 我的递归函数对位于矩阵边界的元素进行处理。 现在我想在内部矩阵上调用它(递归调用): 这是我的递归函数的原型: void rotate(int** mat, size_t n); 我知道2D数组是数组中的数组。 我知道*(mat+1) + 1)将给出应该是我的新矩阵的基地址的内存地址。 这是我试过的: rotate((int **)(*(mat+1) + 1), n-2) 但它不起作用,当我尝试使用[][]访问它时,我得到一个段错误。

分段错误反转字符串文字

#include #include int main(void) { //char s[6] = {‘h’,’e’,’l’,’l’,’o’,’\0′}; char *s = “hello”; int i=0,m; char temp; int n = strlen(s); //s[n] = ‘\0’; while (i<(n/2)) { temp = *(s+i); //uses the null character as the temporary storage. *(s+i) = *(s+ni-1); *(s+ni-1) = temp; i++; } printf("rev string = %s\n",s); system("PAUSE"); return 0; } 在编译时,错误是分段错误(访问冲突)。 […]

将int转换为void *或反之亦然意味着什么?

从存储器的角度来看,将整数值转换为void*或反之亦然? 我的理解是void*是一个未指定长度的内存块的地址。 这似乎就像比较苹果和橘子一样。 int myval = 5; void* ptr = (void*)myval; printf(“%d”,(int)ptr); 我意识到我应该给出使用它的确切上下文。 int main(int argc, char* argv[]) { long thread; /* Use long in case of a 64-bit system */ pthread_t* thread_handles; /* Get number of threads from command line */ if (argc != 2) Usage(argv[0]); thread_count = strtol(argv[1], NULL, 10); if (thread_count MAX_THREADS) […]

如何从另一个模块调用导出的内核模块函数?

我正在编写一个API作为内核模块,为设备驱动程序提供各种function。 我在mycode.c中写了三个函数。 然后我构建并加载了模块,然后将mycode.h复制到 / include / linux中 。 在设备驱动程序中,我有一个#include 并调用这三个函数。 但是当我构建驱动程序模块时,我收到三个链接器警告,说明这些函数是未定义的 。 笔记: 函数在mycode.h中声明为extern 使用mycode.c中的EXPORT_SYMBOL(func_name)导出函数 运行命令nm mycode.ko显示符号表中可用的所有三个函数(它们旁边的大写字母T,表示符号在文本(代码)部分中找到) 加载模块后,命令grep func_name / proc / kallsyms将所有三个函数显示为已加载 很明显,函数正确导出,内核知道它们的位置和位置。 那么为什么司机不能看到他们的定义呢? 知道我错过了什么吗? 编辑:我在这里找到了一些相关信息: http : //www.kernel.org/doc/Documentation/kbuild/modules.txt 有时,外部模块使用来自另一个外部模块的导出符号。 kbuild需要完全了解所有符号,以避免吐出有关未定义符号的警告。 这种情况存在三种解决方案。 注意:建议使用顶级kbuild文件的方法,但在某些情况下可能不切实际。 使用顶级kbuild文件如果你有两个模块,foo.ko和bar.ko,其中foo.ko需要来自bar.ko的符号,你可以使用一个通用的顶层kbuild文件,所以这两个模块都是用同一个编译的建立。 请考虑以下目录布局: ./foo/ <= contains foo.ko ./bar/ <= contains bar.ko The top-level kbuild file would then look like: #./Kbuild (or ./Makefile): […]

clflush通过C函数使缓存行无效

我试图使用clflush手动驱逐缓存行,以确定缓存和行大小。 我没有找到关于如何使用该指令的任何指南。 我所看到的,是一些使用更高级别function的代码。 有一个内核函数void clflush_cache_range(void *vaddr, unsigned int size) ,但我仍然不知道在我的代码中包含什么以及如何使用它。 我不知道该function的size是多少。 更重要的是,我怎样才能确定该行被驱逐以validation我的代码的正确性? 更新: 这是我想要做的初始代码。 #include #include #include #include int main() { int array[ 100 ]; /* will bring array in the cache */ for ( int i = 0; i < 100; i++ ) array[ i ] = i; /* FLUSH A LINE */ /* […]

使用FFMPEG库接收RTSP流

我使用RTSP在LAN流video上有一个IPCamera。 我已经能够使用ffplay命令成功捕获并显示它: ffplay rtsp://admin:123456@192.168.2.50:7070 (带身份validation) 所以我想使用ffmpeg库在C / C ++中使用编程实现相同的function。 我想这一定是可能的。 那么让我说两个简单的问题: 如何使用FFMPEG库在C / C ++程序中接收流? (只是提供一些URL /教程,因为谷歌没有帮助) 如何显示收到的video? (在这里,一些很好的URL指导我)。