_msize (ptr) отлично, и с VLA-затухающим указателем, что я мог сделать? - PullRequest
0 голосов
/ 09 января 2019

(Прежде всего: этот код предназначен для запуска только на Windows10, но поведение на других ОС интересно. Конечно, измените _msize соответствующей функцией)

Часть I кода. Выделение памяти выполняется с помощью malloc, и я использую _msize, чтобы напечатать номер элемента массива в функции (я знаю, что по причине выделения памяти ... я мог бы иметь более высокое значение, но я еще не наблюдал такого случая. Если у вас есть реальный случай, когда это происходит, мне интересно, но это не главная причина моего вопроса)

Часть II кода: та же идея, но с переменным массивом длины. У меня два вопроса. Во-первых, существует ли эквивалент _msize для VLA? и во-вторых, моя программа зависает, почему _msize не возвращает?

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

void myfoo(int *array) {
    printf("Nb elt of an array obtained from its pointer %d\n",_msize(array)/sizeof(int));
}

int main() {
    int n=1;

    printf("Part 1 : malloc\n");
    while(n>0) {
        printf("n : ");scanf("%d",&n);
        if (n<0) break;
        int *array;
        array=malloc(n*sizeof(int));
        for (int i=0;i<n;i++) {array[i]=i;}
        myfoo(array);
        free(array);
    }

    n=1;
    printf("Part 1I : Variable Length Array\n");
    while(n>0) {
        printf("n : ");scanf("%d",&n);
        if (n<0) break;
        int array[n];
        for (int i=0;i<n;i++) {array[i]=i;}
        myfoo(array);
    }
}

1 Ответ

0 голосов
/ 09 января 2019

VLA (в стеке) не является ожидаемым значением на _msize, учитывая, что ожидаемый объем памяти взят из кучи, выделенной динамическим распределителем:

[... Возвращает размер блока памяти, выделенного в куче. ...]

[... Функция _msize возвращает размер в байтах блока памяти, выделенного вызовом calloc, malloc или realloc. ...]

По этой причине первая часть кода должна работать, как и ожидалось, но не вторая.

Для полноты картины, когда вы передаете массив, он распадается на указатель, поэтому функция получает только указатель. Таким образом, функция должна получить количество элементов в массиве (кроме указателя). Смотрите это: Передача многомерного массива переменной длины в функцию

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