将char 转换为char **导致段错误?

好吧我的C有点生疏,但我想我会在C中制作我的下一个(小)项目,所以我可以对它进行修改,不到20行,我已经有了一个seg错误。 这是我的完整代码: #define ROWS 4 #define COLS 4 char main_map[ROWS][COLS+1]={ “a.bb”, “ac”, “adc.”, “.dc.”}; void print_map(char** map){ int i; for(i=0;i<ROWS;i++){ puts(map[i]); //segfault here } } int main(){ print_map(main_map); //if I comment out this line it will work. puts(main_map[3]); return 0; } 我对这是如何导致段错误感到困惑。 从[][]为**时发生了什么? 这是我得到的唯一警告。 rushhour.c:23:3:警告:从不兼容的指针类型传递’print_map’的参数1 rushhour.c:13:7:注意:预期’char **’但参数类型为’char(*)[5]’ [][]和**真的不兼容指针类型吗? 它们似乎只是我的语法。

从调用堆栈中获取函数名称

我正在开发一个调用本机代码的Android程序。 该本机代码是segfaulting,因为通过android NDK进行调试并不是真的可行,所以我留下了一个如下所示的callstack(从ddms中捕获)。 我的问题是,在将callstack中的内存地址转换为函数名之后是否可以手动运行,以便我可以看到这是segfaulting的位置。 谢谢 02-22 14:47:39.231: DEBUG/dalvikvm(504): Trying to load lib /data/data/android.TestApp/lib/libDM.so 0x43b7c938 02-22 14:47:39.301: DEBUG/dalvikvm(504): Added shared lib /data/data/android.TestApp/lib/libDM.so 0x43b7c938 02-22 14:47:39.310: DEBUG/dalvikvm(504): No JNI_OnLoad found in /data/data/android.TestApp/lib/libDM.so 0x43b7c938 02-22 14:47:39.406: DEBUG/dalvikvm(504): +++ not scanning ‘/system/lib/libwebcore.so’ for ‘onLoadModel’ (wrong CL) 02-22 14:47:39.410: DEBUG/dalvikvm(504): +++ not scanning ‘/system/lib/libmedia_jni.so’ for ‘onLoadModel’ (wrong CL) 02-22 14:47:39.410: […]

使用scanf()输入字符的问题

我正在尝试将一个角色输入一个链接列表,其中角色可以是’A’,’a’,’G’,’g’,’T’,’t’,’C’或’c’。 我还不熟悉C,我知道我搞砸了一些东西: do{ printf (“\nEnter a new nucleotide: \n”); scanf(“%c”,&newChar); /* Checking */ if(newChar == ‘A’ || newChar == ‘a’ || newChar == ‘G’ || newChar == ‘g’ || newChar == ‘T’ || newChar == ‘t’ || newChar == ‘C’ || newChar == ‘c’ ) { AddToSequence(newChar); size++; } else { printf (“\nBad Element”); } […]

奇怪的编译器警告C:警告:在参数列表中声明’struct’

我刚发现C中的一个怪癖,我觉得很困惑。 在C语言中,可以在声明结构之前使用指向结构的指针。 这是一个非常有用的function,因为当你只处理指针时,声明是无关紧要的。 我刚刚发现了一个角落的情况,但是(令人惊讶的是)并非如此,我无法解释原因。 对我来说,这似乎是语言设计中的一个错误。 拿这个代码: #include #include typedef void (*a)(struct lol* etc); void a2(struct lol* etc) { } int main(void) { return 0; } 得到: foo.c:6:26: warning: ‘struct lol’ declared inside parameter list [enabled by default] foo.c:6:26: warning: its scope is only this definition or declaration, which is probably not what you want [enabled […]

为什么printf圆形浮点数?

我试图使用printf打印一些浮点数。 例如: int main() { printf(“%.1f”,76.75); return 0; } 输出:76.8 我对结果有一些疑问。 首先,为什么不打印76.7? 第二,它是如何围绕这个数字的呢?

与SSE并行的前缀(累计)总和

我正在寻找有关如何与SSE进行并行前缀和的一些建议。 我有兴趣在一系列的整数,浮点数或双精度数上做这个。 我想出了两个解决方案。 一个特例和一般情况。 在这两种情况下,解决方案在与OpenMP并行的两次传递中在arrays上运行。 对于特殊情况,我在两次传球时使用SSE。 对于一般情况,我只在第二遍使用它。 我的主要问题是如何在一般情况下的第一遍中使用SSE? 以下链接simd-prefix-sum-on-intel-cpu显示字节的改进,但不是32位数据类型。 特殊情况称为特殊情况的原因是它要求数组采用特殊格式。 例如,让我们假设浮点数组中只有16个元素。 然后,如果数组像这样重新排列(结构数组结构): a[0] a[1] …a[15] -> a[0] a[4] a[8] a[12] a[1] a[5] a[9] a[13]…a[3] a[7] a[11] a[15] SSE垂直总和可用于两个通道。 但是,只有当数组已经采用特殊格式并且输出可以以特殊格式使用时,这才有效。 否则,必须在输入和输出上进行昂贵的重新排列,这将使其比一般情况慢得多。 也许我应该考虑一个不同的前缀和算法(例如二叉树)? 一般情况的代码: void prefix_sum_omp_sse(double a[], double s[], int n) { double *suma; #pragma omp parallel { const int ithread = omp_get_thread_num(); const int nthreads = […]

从函数返回char / string

我在C中编码相当新,目前我正在尝试创建一个返回ac string / char数组并分配给变量的函数。 到目前为止,我已经观察到返回char *是最常见的解决方案。 所以我试过: char* createStr() { char char1= ‘m’; char char2= ‘y’; char str[3]; str[0] = char1; str[1] = char2; str[2] = ‘\0’; char* cp = str; return cp; } 我的问题是如何使用这个返回的char*并将它指向的char数组赋值给char []变量? 我尝试过(都导致了noob-drowning错误): char* charP = createStr(); char myStr[3] = &createStr(); char* charP = *createStr();

typedef如何用于函数指针

我想我可能患有可怕的“偶然程序员”疾病,至少在涉及typedef和函数指针时。 所以我一直在试验各种涉及这些的组合,根据我得到的所有输出来分析结果。 但是,当我继续尝试不同的组合,而不是分析结果,我现在只是在过程中丢失。 我希望你们能帮助我搞清楚这个烂摊子。 第一个代码示例 typedef void (print)(void); void do_something (void) { printf(“Hello World\n”); } print *pr; pr = &do_something; pr(); // Hello World 第二个代码示例 typedef void (print)(void); void do_something (void) { printf(“Hello World\n”); } print *pr; pr = do_something; pr(); // Hello World 上面的代码示例如何工作,好像’&’对函数名称没有影响 第三个代码示例 typedef void (print)(void); void do_something (void) { printf(“Hello World\n”); […]

比较C中的浮点数

我有一个打印为0.000000的double ,我试图将它与0.0f进行比较, 0.0f成功。 为什么这里有区别? 什么是最可靠的方法来确定你的双倍是零?

创建静态Mac OS XC构建

如何在Mac OS X上创建.c文件的静态版本? 当我尝试: gcc -o test Main.c -static 我明白了: ld: library not found for -lcrt0.o collect2: ld returned 1 exit status