0

主文件中使用的所有函数均已正确定义。但是,当我尝试进入调试模式时,由于某种原因,IDE 在被要求时没有进入所述功能。取而代之的是,它就像一个步骤并忽略了这些行,直到最后一行,所有变量都出乎意料地出现在窗口中;在此之前,没有任何变量存在。

这是主文件:

#include "pointers.h"

int main(void){
    whatisapointer();
    whatisthesizeofapointer();
    whatareNpointersplacedsuccessively(6);
    return 0;
}

用于在 main 中定义函数的 pointers.c 文件:

#include "pointers.h"

void whatisapointer(){
    int *pointer;                   
    pointer = allocateOneInteger(); 
    *pointer = 42;                  
}

void whatisthesizeofapointer(){
    int a = sizeof(char);
    int b = sizeof(int);
    int c = sizeof(char*);
    int d = sizeof(int*);
}

void whatareNpointersplacedsuccessively(int N){
    int i, *Npointer, *current;
    char *Npointerchar, *currentchar;
    Npointer = allocateNInteger(N);
    current = Npointer;
    current = Npointer+1;
    current = Npointer+2;
    for(i=0;i<N;i++) *(Npointer+i) = i;
    N=2*N;
    Npointerchar = allocateNChar(N);
    currentchar = Npointerchar;
    currentchar = Npointerchar+1;
    currentchar = Npointerchar+2;
    for(i=0;i<N;i++) Npointerchar[i] = 65+i;
    Npointer[N-3] = 0x68676665;
    current = Npointer+N-3;
}


int* allocateOneInteger(){
    return (int*)malloc(1*sizeof(int));
}

int* allocateNInteger(int N){
    return (int*)malloc(N*sizeof(int));
}

char* allocateNChar(int N){
    return (char*)malloc(N*sizeof(char));
}


void echange(int a,int b)
{
    int temp;
    temp=a;
    a=b;
    b=temp;
}

void echangep(int *pa,int *pb)
{
    int temp;
    temp=*pa;
    *pa=*pb;
    *pb=temp;
}

/* Fonction allocateNFloat
 */
void allocateNFloat(int N){

}

和makefile:

CC := gcc
FLAGS := -g -Wall -Werror

all : prog

prog : pointers.o mainpointers.o
        $(CC) pointers.o mainpointers.o -o prog

fonctions.o : pointers.c pointers.h
        $(CC) -c pointers.c $(FLAGS) -o pointers.o
        
mainpointers.o : mainpointers.c pointers.h
        $(CC) -c mainpointers.c $(FLAGS) -o mainpointers.o

clean : 
            rm -f *.o
            rm -f prog

我做了一些研究,没有一个可以帮助我解决这个问题。

4

1 回答 1

0

您很可能会发现编译器正在优化您的代码,因为这些函数没有副作用。(如果您不熟悉副作用的概念,其要点是“更改可能影响程序其他部分的程序状态”——编译器会积极修剪无副作用的代码,因为根据定义,所以不会改变程序的行为。)

即使分配内存也不是副作用,因为正确的代码永远无法判断程序的另一部分是否已分配内存。

最简单的副作用是打印出您想通过调试器检查的任何中间计算的结果;这将迫使优化器将代码留在原处。

例如,

int foo() //no side effects, will be optimized to an empty function or pruned.
{
    char *test = malloc(4096);
    strcpy(test, "My test string");
    return 0;
}

int foo() //dumb side effects
{
    char *test = malloc(4096);
    strcpy(test, "My test string");
    printf("%02x", ((int)test & 0xff) ^ (test[0]) );//make output depend on the operations you wish to observe
    return 0;
}

另一种验证编译器是否正在删除您的代码的方法是反汇编生成的目标文件...您应该看到这些函数由单个“返回”指令组成...这是调试器通过突出显示的内容结束花括号。

于 2020-11-27T21:43:00.177 回答