jatinp510 Ответов: 3

Почему выделенная память фиксирована .


Subham и двоичные строки | основы битовой манипуляции и основные проблемы практики программирования | HackerEarth[^]

Что я уже пробовал:

#include <stdio.h>
 
int main()
{
    int t,n,i;
    scanf("%d",&t);
    
    while(t--){
        scanf("%d",&n);
        char arr[100000];
        int count=0;
        
        scanf("%s",&arr);
        for(i=0;i<strlen(arr);i++){
            if(arr[i]=='0')
            count++;
        }
        
        printf("%d\n",count);
    }
    return 0;
}


но если я использую arr[n] для указания размера массива.
почему мы должны фиксировать размер массива.
мой код работает только для 1-го тестового случая.
пожалуйста, объясните мне, что эта проблема возникла.

3 Ответов

Рейтинг:
2

jatinp510

#include <stdio.h>
 
int main()
{
    int t,n,i;
    scanf("%d",&t);
    
    while(t--){
        scanf("%d",&n);
        char arr[n];
        int count=0;
        
        scanf("%s",&arr);
        for(i=0;i<strlen(arr);i++){
            if(arr[i]=='0')
            count++;
        }
        
        printf("%d\n",count);
    }
    return 0;


он работает для 1-го тестового случая .
и если я использую char[100000], то есть если я исправлю размер массива, он будет работать для всех тестовых случаев.
пожалуйста, проверьте вопросы в hackerearth.com раз.


Рейтинг:
1

OriginalGriff

Когда вы объявляете массив, вы должны сказать системе, сколько элементов (и какого типа) вам нужно - в противном случае она не может дать вам правильное число, и если она даст вам слишком мало, вы превысите выделенную память и запишете другие данные. Это либо вызовет ошибку в вашем приложении, либо приведет к его прекращению при попытке получить доступ к памяти, которой у него нет.

Это похоже на поход в кофейню: вы должны сказать им, какой размер напитка вы хотите, потому что если они дадут вам самый большой, который они могут, вы не захотите платить за него, и если они дадут вам чашку эспрессо, вы можете быть очень разочарованы.

Другое решение состоит в том, чтобы прочитать n и использовать malloc чтобы выделить необходимое пространство - n * размер элемента в байтах. Не забудьте освободить память, когда вы закончите с ней!


jatinp510

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

jatinp510

#включить <stdio.h>

тап_п()
{
инт т н я;
scanf("%d",&t);

while(t--){
scanf("%d",&n);
char arr[100000];// что делать, если я напишу char arr[n]
int count=0;

scanf("%s",&arr);
for(i=0;i<strlen(arr);i++){
if(arr[i]=='0')
считать++;
}

printf("%d\n",count);
}
возвращает 0;
}

OriginalGriff

Вы не можете изменить размер массива в цикле: он фиксируется, как только вы его определяете.
Если вы хотите изменить размер, вам нужно использовать malloc.

jatinp510

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

jatinp510

#include<bits/stdc++.h>
использование пространства имен std;

тап_п()
{
ios_base::sync_with_stdio(false);
Кин.галстук(нуль);

инт т н я;
cin>>t;
while(t--){
cin>>n;
int a[n],b[n];
для(i=0;i<n;i++){
cin>>a[i];
}
для(i=0;i<n;i++){
cin>>b[i];
}
сортировка(a,a+n);
сортировка(b,b+n);

если(a[n-1]==b[n-1])
cout<<"галстук\n";
иначе если(a[n-1]>b[n-1])
cout<<"Bob\n";
еще
cout<<"Алиса\n";
}
возвращает 0;
}

https://www.hackerearth.com/practice/basic-programming/implementation/basics-of-implementation/practice-problems/algorithm/warcakewalk/

jatinp510

здесь я изменяю размер массива в каждом тестовом случае

Рейтинг:
1

CPallini

Цитата:
scanf("%d",&n);
char arr[n];
int count=0;
scanf("%s",arr);

C99 позволяет динамическое выделение памяти в стеке, следовательно
char arr[n];
это действительное утверждение.
Однако ваш код несовершенен, потому что scanf("%s",arr); мог бы обогнать arr буфер (например, предположим, что пользователь устанавливает n=5 а потом входит в строку "foobar").


jatinp510

plzzz... обратитесь к вопросу в hackerearth.com -да ...
пользователь может использовать только 5 символов ввода, если n=5.
он не может использовать 6 символов.
а если мой код неверен для arr[n];
затем,
почему он работает для 1 тестового случая ques.