Arhn - архитектура программирования

Переданный параметр изменяет значение

Вот код:

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

void foo(int* ptr) {
    printf("ptr is %x\n", ptr);
}

void main() {
    int* ptr = (int*)malloc(sizeof(int));
    printf("ptr is %x\n", ptr);
    foo(ptr);
    free(ptr);
}

...И он выход:

ptr is 0x007446c0
ptr is 0x00000000

...И вот вопрос:
Почему это происходит со мной???


  • рискуя стать таким же заезженным рекордом, как и все остальные, не применяйте malloc() в C — используйте int* ptr = malloc(sizeof(int)); 22.03.2013
  • @ Jacob Spire См. это: результат malloc">stackoverflow.com/questions/1565496/ 22.03.2013
  • @JacobSpire Я попробовал вашу программу Visual C++ 2010 Express и получил правильные отпечатки. Вы уверены, что получили второе число как 0x0? 22.03.2013
  • @Ganesh - значения, которые вы видите, могут отличаться из-за изменяемого ответа lvalue, передача неправильного спецификатора формата - UB. 22.03.2013
  • @Mike .. Спасибо .. почему спецификатор формата %x должен печатать 0x0 вместо какого-либо другого значения junk? 22.03.2013
  • @Ganesh - UB означает неопределенное поведение, неопределенное поведение означает, что все может случиться. Так что вполне возможно, что вы увидите 0x0, как Джейкоб, или правильное значение, как вы, или даже банан. Нет никакого способа узнать, что произойдет. 22.03.2013

Ответы:


1

Я полагаю, потому что ваша программа вызывает неопределенное поведение. Вот что, я думаю, вы имели в виду:

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

void foo(int* ptr) {
    printf("ptr is %p\n", (void *) ptr); /* %x tells printf to expect an unsigned int. ptr is not an unsigned int. %p tells printf to expect a void *, which looks a little better, yeh? */
}

int main() { /* main ALWAYS returns int... ALWAYS! */
    int* ptr = malloc(sizeof(int)); /* There is no need to cast malloc. Stop using a C++ compiler to compile C. */
    printf("ptr is %p\n", (void *) ptr);
    foo(ptr);
    free(ptr);
}

Это решит вашу проблему?

22.03.2013

2

Это происходит потому, что %x в printf ожидает целое число без знака, а не указатель.

Вот как исправить вашу программу, чтобы получить желаемое поведение:

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

void foo(int* ptr) {
    printf("ptr is %p\n", (void*)ptr);
}

int main() {
    int* ptr = malloc(sizeof(int));
    printf("ptr is %p\n", (void*)ptr);
    foo(ptr);
    free(ptr);
    return 0;
}

Вот ссылка на ideone; прогон дает ожидаемый результат:

ptr is 0x8fa3008
ptr is 0x8fa3008
22.03.2013
  • Я попробовал исходную программу с %x, и она отлично работает без каких-либо проблем. Я попробовал как gcc (MinGW), так и Visual C++ 2010 Express, и в обеих средах это было успешно. Почему %x должен печатать 0x0, а не какой-то ненужный номер? 22.03.2013
  • @Ganesh В этом опасность неопределенного поведения: иногда оно дает правильные результаты. Одной из причин, по которой %x может печатать ноль, является 64-битный адрес: старшая половина вполне может быть нулевой. 22.03.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..