VC与GCC代码编译差别(一)

Manacher算法,实现最长回文字符串检测的算法。算法实现在Gcc编译环境下运行出现错误,但是在VC环境下运行正常。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void PrintString(char* s);
char* longestPalindrome(char* s) {
    int index_s=0,index_f=1;
    int id=1,mx=0;
    int str_len = strlen(s);
    int* pos_table = (int*)malloc(str_len*2+3);
    char* full_str = (char*)malloc(str_len*2+3);/* abc --> $#a#b#c#‘0‘ */

    printf("strlen = %d\n",str_len);
    *(full_str) = ‘$‘;
    while(*(s+index_s) != ‘\0‘){
        *(full_str+index_f) = ‘#‘;
        index_f++;
        *(full_str+index_f) = *(s+index_s);
        index_f++;
        index_s++;
    }
    *(full_str+index_f) = ‘#‘;
    *(full_str+index_f+1) = ‘\0‘;
    printf("full string is ");PrintString(full_str);
    str_len = strlen(full_str);
    printf("sizeof new string is %d\n",str_len);
    *(pos_table) = 1;
    for (index_f = 1; index_f < str_len; index_f++){
        printf("index_f=%d,mx=%d,id=%d\n",index_f,mx,id);
        if (index_f < mx){
            if (*(pos_table+2*id-index_f) < (mx-index_f)){
                *(pos_table+index_f) = *(pos_table+2*id-index_f);
                continue;
            } else {
                *(pos_table+index_f) = *(pos_table+2*id-index_f);
                for (index_s = mx+1; index_s < str_len; index_s++){
                    printf("index_s=%d",index_s);
                    if (*(full_str+index_f+index_s) == (*(full_str+index_f-index_s))){
                        *(pos_table+index_f) += 1;
                    }else{
                        break;
                    }
                }
                id = index_f;
                mx = index_f+index_s-1;
                continue;
            }
        } else {
            *(pos_table+index_f) = 1;
            for (index_s = 1; index_s < str_len; index_s++){          // 以下四句打印输出均不正常,类似于新开辟的字符串缓冲区被破坏了一样。
                printf("\tindex_f=%d,index_s=%d,full_str=%d \n",index_f,index_s,(int)full_str);
                printf("\tfull_str[i]=%c, \t",*(full_str+index_f+index_s));
                printf("\tfull_str[-i]=%c \n",*(full_str+index_f-index_s));
                
printf("full string is ");PrintString(full_str);

                if (*(full_str+index_f+index_s) == (*(full_str+index_f-index_s))){
                    *(pos_table+index_f) += 1;
                }else{
                    break;
                }
            }
            id = index_f;
            mx = index_f+index_s-1;
        }
        continue;
    }
    for (index_f = 0; index_f < str_len; index_f++){
        printf("%d",*(pos_table+index_f));
    }
    printf("\n");
    return full_str;
}

void PrintString(char* s)
{
    int index=0;
    while(*(s+index) != ‘\0‘){
        printf("%c",*(s+index));
        index++;
    }
    printf("\n");
}

int main(void)
{
    char* s="aba";
    char* result;

    result = longestPalindrome(s);
    printf("This is question No.5 \n");
}

出错的情形如下图所示:

 Gcc环境下出错的情形  VC环境下正常的情形
时间: 2024-10-11 13:39:03

VC与GCC代码编译差别(一)的相关文章

VC和gcc在保证功能static对线程安全的差异变量

VC和gcc不同,不能保证静态变量的线程安全性.这就给我们的程序带来了非常大的安全隐患和诸多不便.这一点应该引起我们的重视!尤其是在构造函数耗时比較长的时候.非常可能给程序带来意想不到的结果.本文从測试代码開始,逐步分析原理,最后给出解决方式. 多线程状态下.VC不能保证在使用函数的静态变量的时候,它的构造函数已经被运行完成,以下是一段測试代码: class TestStatic { public: TestStatic() { Sleep(1000*10); m_num = 999; } pu

VC和gcc在保证函数static变量线程安全性上的区别

VC和gcc不同,不能保证静态变量的线程安全性.这就给我们的程序带来了很大的安全隐患和诸多不便.这一点应该引起我们的重视!尤其是在构造函数耗时比较长的时候,很可能给程序带来意想不到的结果.本文从测试代码开始,逐步分析原理,最后给出解决方案. 多线程状态下,VC不能保证在使用函数的静态变量的时候,它的构造函数已经被执行完毕,下面是一段测试代码: class TestStatic { public: TestStatic() { Sleep(1000*10); m_num = 999; } publ

GCC的编译和安装 很好的资料

http://blog.csdn.net/yrj/article/details/492404 1.GCC的编译和安装2.预处理    #define 可以支持不定数量的参数.    例子如下:    #define err(...) fprintf(stderr,__VA_ARGS__)    err("%s,%d/r/n","The error code:",48);    扩展为:    fprintf(stderr,"%s,%d/r/n"

GCC与编译过程

GCC与编译过程   GCC(GNU Compiler Colletion),GUN编译器套装,是一套由GNU开发的编程语言编译器.Linux系统下的GCC编译器实际上是调用其他不同的工具来完成预处理.编译.汇编和链接工作. 一.编译过程 在计算机的眼里,只有1和0.不幸的是,我们用C语言写出来的代码,计算机无法直接看明白.所以一个程序如果需要被计算机执行,那么就必须翻译成能被计算机读懂并执行的1和0.实现这一结果的过程,我们称之为编译. 编译包括以下步骤:预处理.编译.汇编和链接.具体过程如下

C代码编译成可执行程序的过程

C代码通过编译器编译成可执行代码,经历了四个阶段,依次为:预处理.编译.汇编.链接. 接下来详细讲解各个阶段 一.预处理 1.任务:进行宏定义展开.头文件展开.条件编译,不检查语法. 2.命令:gcc -E [源文件]  -o [预处理文件] 3.案例:用gcc编译器预处理demo1.c代码,预处理后的文本放到demo1.i中.(gcc -E demo1.c -o demo1.i) demo1.c代码如下: 1 #include <stdio.h> 2 3 #define add(a, b)

gcc 动态编译 动态库路径

gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令优点:体积小,编译快缺点:依赖性高 代码如下: [[email protected] shared]# cat add.cint add (int x, int y) {return x + y;} Parsed in 0.007 seconds at 12.13 KB/sadd.c 求和函数 代码如下: [[email protected] shared]# cat print.

Keil5.15使用GCC编译器编译STM32工程

我们使用Keil一般使用ARMCC编译MCU工程代码.其实,Keil也是支持内嵌GCC编译器的.我们可以使用GCC来编译我们的工程代码. 一.下载GCC编译器 GCC编译器下载地址 二.安装GCC 我们可以把GCC解压到keil的安装目录下面.如下图 三.配置Keil使用GCC编译器 1.配置CC编译规则,Misc Controls 填写 -mcpu=cortex-m4 -mthumb -fdata-sections -ffunction-sections 2.Assembler中规则,Misc

【转】vlc android 代码编译

转自:http://blog.csdn.net/asircao/article/details/7734201 系统:ubuntu12.04代码:git://git.videolan.org/vlc-ports/android.git代码版本:375646994d0602 年初的时候搞了三个月的vlc android.昨天看到vlc android的beta版本发布了,决定编译一个看看效果.把自己此次的编译过程记录下来,供朋友们参考.下文中的文件路径,要替换成正确的路径. 1. 搭建ubuntu

gcc在编译时头文件路径和动态链接库路径

在使用gcc编译连接生成可执行文件时,经常会碰到变量未定义.链接时或者运行可执行文件时找不到相应的动态库等问题,本文首先介绍了gcc在编译时头文件路径相关选项以及搜索路径顺序,然后讨论了编译成可执行文件时动态库的搜索路径顺序,最后说明了生成可执行文件后,运行文件时动态库的搜索路径顺序.搞清楚这三个搜索路径,在用gcc碰到的未定义变量或搜索不到动态库的问题,基本上都可以解决了. 头文件路径编译时相关选项 gcc可以使用选项-I(注意是大写)来指定头文件搜索路径,即头文件所在的文件夹.指定的路径即可