/*
* LinkList_sy.c
*
* Created on: 2017年11月13日
* Author: Administrator
*/
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct node{
elemtype data;
struct node* next;
}Node;
typedef Node* list;
Node* CreateHead(Node* head);
void CreateList(Node* head , elemtype d);
void PrintList (Node* head);
int main(){
Node* h = NULL;
h = CreateHead(h);
int m;
while(1){
scanf("%d",&m);
if(m==0)
break;
else{
CreateList(h , m);
}
}
PrintList(h);
return 0;
}
list CreateHead(Node* head){
head = (Node*)malloc(sizeof(Node));
if(!head){
printf("error");
}
head->data = 0;
head->next = NULL;
printf("malloc success\n");
printf("%p\n",head);
return head;
}
void CreateList(Node* head , elemtype d ){
Node *tail = head;
while(tail->next!=NULL){
tail = tail->next;
}
Node *p = NULL;
p = (Node*)malloc(sizeof(Node));
if(!p){
printf("error");
}
p->data = d;
tail->next = p;
p->next = NULL;
tail = p;
}
void PrintList (Node* head){
printf("%p\n",head);
Node *p = head->next;
while(p!=NULL){
printf("%d\n",p->data);
p = p->next;
}
}
我不清楚这是IDE自身的原因还是和编译器有关,我机器使用相同的编译器,都为mingw gcc 6.3.0
再放出编译源代码的参数截图
我没学过编译原理,只是想了解为何程序运行顺序会不同,因为不科学呀~~
7 个解决方案
#1
无论什么编译器也不存在改变程序的顺序结构吧。
#2
首先如果不是程序问题,编译器不会改变运算顺序;
在不同的编译器上,输出的头结点地址不一样很正常(但是一次执行内输出的地址肯定是一样的,因为都是同一个头结点),因为及时是同一个编译器不同时间执行的结果,头结点的地址值可能也不一样。因为头结点的地址是有系统分配的,即malloc函数;
程序没什么问题,你看到的不同编译器编出来的程序输出地址值不一样这个是很正常的。
在不同的编译器上,输出的头结点地址不一样很正常(但是一次执行内输出的地址肯定是一样的,因为都是同一个头结点),因为及时是同一个编译器不同时间执行的结果,头结点的地址值可能也不一样。因为头结点的地址是有系统分配的,即malloc函数;
程序没什么问题,你看到的不同编译器编出来的程序输出地址值不一样这个是很正常的。
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct node{
elemtype data;
struct node* next;
}Node;
typedef Node* list;
Node* CreateHead(Node* head);
void CreateList(Node* head , elemtype d);
void PrintList (Node* head);
int main()
{
Node* h = NULL;
h = CreateHead(h);
int m;
while(1){
scanf("%d",&m);
if(m==0)
break;
else{
CreateList(h , m);
}
}
PrintList(h);
return 0;
}
list CreateHead(Node* head)
{
head = (Node*)malloc(sizeof(Node));
if(!head){
printf("error");
exit(0);
}
head->data = 0;
head->next = NULL;
printf("malloc success\n");
printf("%p\n",head);
return head;
}
void CreateList(Node* head , elemtype d )
{
Node *tail = head;
while(tail->next!=NULL){
tail = tail->next;
}
Node *p = NULL;
p = (Node*)malloc(sizeof(Node));
if(!p){
printf("error");
}
p->data = d;
tail->next = p;
p->next = NULL;
//tail = p; /*这句没有意义,因此属于冗余代码*/
}
void PrintList (Node* head)
{
printf("%p\n",head);
Node *p = head->next;
while(p!=NULL){
printf("%d\n",p->data);
p = p->next;
}
}
#3
你的代码和你的输出 不匹配
你的代码里
malloc success
指针
后面没有
______________
你的代码里输出了
_____
你没保存吗
你的代码里
malloc success
指针
后面没有
______________
你的代码里输出了
_____
你没保存吗
#4
谢谢各位的提醒
首先,编译器是相同的,那几个输出语句是开始我为了测试结果用的,正常的输出结果应该是codeblocks上显示的
首先,编译器是相同的,那几个输出语句是开始我为了测试结果用的,正常的输出结果应该是codeblocks上显示的
#5
输出的横线部分是在main函数里的CreateHead(h)函数下一行
CreateList函数的最后一行确实多余了,多谢指教
CreateList函数的最后一行确实多余了,多谢指教
![相同的程序在不同IDE运行结果不一样, 相同的程序在不同IDE运行结果不一样,](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0hNNkx5OW1iM0oxYlM1amMyUnVMbTVsZEM5UWIybHVkRVp2Y25WdEwzVnBMM05qY21sd2RITXZZM05rYmk5UWJIVm5hVzR2TURBeEwyWmhZMlV2TVRNdVoybG0%3D.jpg?w=700&webp=1)
#6
只是,,,,,想问为何执行顺序不同,相同的编译器...
而且我也知道头节点地址会不同,因为每执行一次程序,头节点就必须要重新申请一次...
而且我也知道头节点地址会不同,因为每执行一次程序,头节点就必须要重新申请一次...
#7
建议单步跟踪程序运行,观察变量变化情况,很容易分析得出原因
#1
无论什么编译器也不存在改变程序的顺序结构吧。
#2
首先如果不是程序问题,编译器不会改变运算顺序;
在不同的编译器上,输出的头结点地址不一样很正常(但是一次执行内输出的地址肯定是一样的,因为都是同一个头结点),因为及时是同一个编译器不同时间执行的结果,头结点的地址值可能也不一样。因为头结点的地址是有系统分配的,即malloc函数;
程序没什么问题,你看到的不同编译器编出来的程序输出地址值不一样这个是很正常的。
在不同的编译器上,输出的头结点地址不一样很正常(但是一次执行内输出的地址肯定是一样的,因为都是同一个头结点),因为及时是同一个编译器不同时间执行的结果,头结点的地址值可能也不一样。因为头结点的地址是有系统分配的,即malloc函数;
程序没什么问题,你看到的不同编译器编出来的程序输出地址值不一样这个是很正常的。
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct node{
elemtype data;
struct node* next;
}Node;
typedef Node* list;
Node* CreateHead(Node* head);
void CreateList(Node* head , elemtype d);
void PrintList (Node* head);
int main()
{
Node* h = NULL;
h = CreateHead(h);
int m;
while(1){
scanf("%d",&m);
if(m==0)
break;
else{
CreateList(h , m);
}
}
PrintList(h);
return 0;
}
list CreateHead(Node* head)
{
head = (Node*)malloc(sizeof(Node));
if(!head){
printf("error");
exit(0);
}
head->data = 0;
head->next = NULL;
printf("malloc success\n");
printf("%p\n",head);
return head;
}
void CreateList(Node* head , elemtype d )
{
Node *tail = head;
while(tail->next!=NULL){
tail = tail->next;
}
Node *p = NULL;
p = (Node*)malloc(sizeof(Node));
if(!p){
printf("error");
}
p->data = d;
tail->next = p;
p->next = NULL;
//tail = p; /*这句没有意义,因此属于冗余代码*/
}
void PrintList (Node* head)
{
printf("%p\n",head);
Node *p = head->next;
while(p!=NULL){
printf("%d\n",p->data);
p = p->next;
}
}
#3
你的代码和你的输出 不匹配
你的代码里
malloc success
指针
后面没有
______________
你的代码里输出了
_____
你没保存吗
你的代码里
malloc success
指针
后面没有
______________
你的代码里输出了
_____
你没保存吗
#4
谢谢各位的提醒
首先,编译器是相同的,那几个输出语句是开始我为了测试结果用的,正常的输出结果应该是codeblocks上显示的
首先,编译器是相同的,那几个输出语句是开始我为了测试结果用的,正常的输出结果应该是codeblocks上显示的
#5
输出的横线部分是在main函数里的CreateHead(h)函数下一行
CreateList函数的最后一行确实多余了,多谢指教
CreateList函数的最后一行确实多余了,多谢指教
![相同的程序在不同IDE运行结果不一样, 相同的程序在不同IDE运行结果不一样,](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0hNNkx5OW1iM0oxYlM1amMyUnVMbTVsZEM5UWIybHVkRVp2Y25WdEwzVnBMM05qY21sd2RITXZZM05rYmk5UWJIVm5hVzR2TURBeEwyWmhZMlV2TVRNdVoybG0%3D.jpg?w=700&webp=1)
#6
只是,,,,,想问为何执行顺序不同,相同的编译器...
而且我也知道头节点地址会不同,因为每执行一次程序,头节点就必须要重新申请一次...
而且我也知道头节点地址会不同,因为每执行一次程序,头节点就必须要重新申请一次...
#7
建议单步跟踪程序运行,观察变量变化情况,很容易分析得出原因