win&linux 在同一个问题上的不同表现
?我在写单链表的逆转时,遇到了一些很有意思的事情。
?
同样一段代码,在
win
和
linux
下是完全两种不同的结果。
#include <stdio.h>#include <stdlib.h>
#include <string.h>
#define SIZE 64
typedef struct info{
int num;
char msg[SIZE];
struct info *next;
}Info;
typedef struct vec{
Info *element;
struct vec *next;
}Vector;
const unsigned int SIZE_INFO = sizeof(Info);
Info *createInfo(Info *header, int nums)
{
int num = 0;
char *msg = "hello msg";
Info *tmp = NULL;
Info *h2 = header;
int i = 0;
#define NUM 4
char strNum[NUM];
memset(strNum, 0x00, NUM);
header->num = 0;
for (i = 0; i < nums; i++) {
tmp = (Info *)calloc(SIZE_INFO, 1);
tmp->num = num++;
strcpy(tmp->msg, msg);
sprintf(strNum, ": %d", tmp->num);
strcat(tmp->msg, strNum);
h2->next = tmp;
h2 = h2->next;
h2->next = NULL;
header->num++;
memset(strNum, 0x00, NUM);
}
return header;
}
void deleteInfo(Info *header)
{
Info *tmp = header->next;
Info *tmp2 = NULL;
while(tmp != NULL) {
tmp2 = tmp->next;
free(tmp);
tmp = tmp2;
}
header->next = NULL;
}
void printInfo(const Info *header)
{
Info *tmp = header->next;
while (tmp != NULL) {
printf("[num]->%dt[msg]->%sn", tmp->num, tmp->msg);
tmp = tmp->next;
}
printf("**END**n");
}
Info *reserve(Info *header)
{
Info *tail = NULL;
Info *tmp = NULL;
Vector *v = (Vector *)calloc(sizeof(Vector), 1);
v->next = NULL;
Vector *vTmp = NULL;
tmp = header;
while(tmp->next != NULL) {
tmp = tmp->next;
vTmp = (Vector *)calloc(sizeof(Vector), 1);
vTmp->element = tmp;
if (v->next == NULL) {
v->next = vTmp;
vTmp->next = NULL;
} else {
vTmp->next = v->next;
v->next = vTmp;
}
}
vTmp = v;
tmp = header;
while (vTmp->next != NULL) {
tmp->next = vTmp->next->element;
vTmp = vTmp->next;
tmp = tmp->next;
}
tmp->next = NULL;
vTmp = v->next;
Vector *vTmp2 = NULL;
while (vTmp != NULL) {
vTmp2 = vTmp->next;
free(vTmp);
vTmp = vTmp2;
}
vTmp = NULL;
free(v);
v = NULL;
return header;
}
void re(Info *header, Info *cur)
{
if (cur->next == NULL) {
header->next = cur;
cur->next = NULL;
} else {
Info *a = NULL;
Info *b = NULL;
if (header == cur) {
a = cur->next;
b = a->next;
} else {
a = cur;
b = cur->next;
}
if (b != NULL) {
re(header, b);
b->next = a;
if (cur == header) a->next = NULL;
}
}
}
int main(int argc, char *argv[])
{
Info *header = (Info *)calloc(SIZE_INFO, 1);
int num;
if (argc == 1) num = 11;
else sscanf(argv[1], "%d", &num);
header = createInfo(header, num);
printInfo(heade