Нарушение прав чтения при вызове size_t * size как * z - PullRequest
0 голосов
/ 12 декабря 2018

Обычно я пишу длинный текст, но эта проблема довольно проста.В настоящее время я работаю над некоторыми API Python C, и мне нужно проанализировать целое число Python для типа size_t*.Если целое число не указано, я хочу, чтобы размер по умолчанию равнялся sizeof(int), но получаю ошибку.Следующий минимальный пример показывает мою проблему:

#include <stdio.h>

int main() {
    size_t *size = (size_t*)sizeof(int);
    fprintf(stdout, "size is: %zu\n", *size);
}

Может ли кто-нибудь объяснить мне, что здесь происходит, кроме "Ошибка нарушения прав чтения"?

1 Ответ

0 голосов
/ 12 декабря 2018

что здесь происходит, кроме «Ошибка нарушения прав чтения»?

мое предположение:

size_t *size = (size_t*)sizeof(int);
                        ^^^^^^ 1
                        ------^^^^^ 2
               ^^^^^^^^^ 3

// 1) sizeof() returns byte count in an unsigned integral type
// 2) sizeof(int) is 4 or 8 depending on compiler and target system

// For diagnostic, I added: 
fprintf(stdout, "\n  lu int size: %lu\n", sizeof(int)); 
// on my lubuntu 18.04 desktop, this line reports: "  lu int size: 4"

// 3) (size_t*) is a c-style cast of the value of sizeof(int)
// fprintf(stdout, "\n  size is: %zu\n", *size);

// g++ reports format ‘%zu’ expects argument of type ‘size_t’
// 
// Running your printf on my lubuntu gives a "3403 Segmentation fault"
// with core dump.

Резюме: я думаю, чтопроисходит »означает, что вы пытаетесь получить доступ к адресу 0x00000008 в своей системе, что, по-видимому, запрещено.

Разрешает ли ваша система (компилятор / os / hw) доступ к адресу 0x00000008?Многие встраиваемые системы этого не делают.

Это действительно то, что вы хотите сделать?(то есть читать int по адресу (возможно, 0x00000008), полученному из размера int)


Эксперимент:

Вы можете попытаться прочитать этот адрес, используя другой метод ...Int?байт?обугливается?access


Возможная основная причина:

Возможно, вашей ОС требуются специальные привилегии для доступа к процессам / задачам.

Возможно, у вашего HW нет памяти в этом месте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...