Предел индекса для массива доступа с арифметикой указателя c в C - PullRequest
1 голос
/ 11 января 2020

Я передаю указатель на большой массив, определенный в Python (миллионы строк), в C -функцию с ctypes.

В C -части я делаю арифметику указателей c в этом массиве для доступа к его значениям. Теперь я получаю некоторые странные / ложные вычисления и думаю, что это из-за арифметики указателя c.

. Как я понимаю, указатели всегда целые, поэтому последняя запись массива, к которой я могу получить доступ, будет максимальным целочисленным значением. этой конкретной c системы.

Так что же произойдет, если я попытаюсь получить доступ к *(array+i), где я больше максимального целого числа? И если это так, как я могу получить доступ к остальным элементам массива?

1 Ответ

2 голосов
/ 11 января 2020

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

В 64-разрядных системах указатели 64-разрядные, в 32-разрядных системах они являются 32-разрядными.

В 32-разрядных операционных системах виртуальное адресное пространство каждого процесса составляет 2 ^ 32 байта, что составляет несколько миллиардов байт (т.е. несколько гигабайт).

В 64-разрядных операционных системах виртуальное адресное пространство каждого процесса составляет 2 ^ 64 байта, что является астрономически большим числом.

Итак что произойдет, если я попытаюсь получить доступ к * (массив + i), где я больше максимального [указателя]?

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

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

Как я понимаю, указатели всегда целочисленные, поэтому последняя запись массива, к которой я могу получить доступ, будет максимальным целочисленным значением эта спецификация c system.

Последний элемент массива, к которому вы можете легально обращаться, зависит от того, сколько памяти вы выделили для массива.

...