Va prezentam de aceasta data o serie de 7 intrebari ce vizeaza limbajul de programare C, si care necesita un nivel mediu spre avansat de cunostinte.
Asteptam sugestiile sau intrebarile dumneavoastra pe rubrica de comentarii.
Tags: capcane-c, intrebari-c, intrebari-interviu, invata-c, quiz-c


Quiz-ul tau e gresit !
1. char b[5] = “abcde”; (nu se poate asigna, array-ul e prea mic, zice la compilare) (intradevar afiseaza el abc#$W, dar nu compileaza mai intai)
3. compileaza de fapt
4. nu compileaza !! void *weird ar trebui sa returneze un pointer, cand de fapt nu returneaza nimic
6. e discutabil. ar putea sa crape, ptr ca strcyp pune si 0 la sfarsit.
Salut. Spre surprinderea ta, nu prea ai dreptate. Incearca sa testezi cu gcc, asta daca ai testat vreun exemplu din cele de mai sus !
Exemplul numarul 1 este valid. GCC nici macar nu arunca un warning pentru char b[5] = “abcde” si compileaza fara probleme. Chiar si char b[5] = “abcdefghijklmn” compileaza, insa da un warning.
Exemplul numarul 3 NU compileaza. Eroarea obtinuta este urmatoarea : error: address of register variable ‘a’ requested .
Exemplul 4 compileaza. Din nou imi pare rau , dar se pare ca nu prea faci diferenta dintre warninguri si erori de compilare.
Exemplul 6 nu crapa.
Am verificat acum:
1) Compileaza. Nu are de ce sa fie array-ul prea mic, deoarece aloca 5 octeti, iar sirul are tot 5 octeti.
ITAssistant:Desktop$ cat 1.c
#include <stdio.h>
#include <string.h>
void f(){
char a[3] = “”;
char b[5] = “abcde”;
memcpy(a,b,3);
printf(“%s\n”,a);
}
int main(){
f();
return 0;
}
ITAssistant:Desktop$ gcc 1.c
ITAssistant:Desktop$ ./a.out
abc��
3) Nu compileaza: error: address of register variable ‘a’ requested
ITAssistant:Desktop$ cat 3.c
#include <stdio.h>
#include <string.h>
int main(){
register int a = 2;
int *ptr = &a;
printf(“%d “,*ptr);
return 0;
}
ITAssistant:Desktop$ gcc 3.c
3.c: In function ‘main’:
3.c:7: error: address of register variable ‘a’ requested
4) Compileaza.
ITAssistant:Desktop$ cat 4.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void *weird(char *dest, const char *src){
while(*dest++ = *src++);
}
int main(){
char *a = calloc(3,sizeof(char));
char *b = calloc(3,sizeof(char));
strcpy(b,”txt”);
weird(a,b);
printf(“%s\n”,a);
return 0;
}
ITAssistant:Desktop$ gcc 4.c
ITAssistant:Desktop$ ./a.out
txt
Intreba la interviuri de GCC? That’s new.
Eu compilez cu VS de obicei.
Ok, pe GCC povestea sta altfel. In Windows, doar cateva compileaza.
)
Depinde de interview
error C2117: ‘a’ : array bounds overflow
error C4716: ‘weird’ : must return a value
Multe probleme stau in compilatorul pe care il ai si mai ales in faptul ca ai Visual Studio C++.
Spre exemplu, in C++ este legal sa folosesti operatorul & pe o variabila declarata register.
De asemenea, am testat in Visual Studio exemplul 1 ( atentie, intr-un fisier cu extensia .c ) si a compilat. De asemenea, exemplul 3 nu a compilat, asa cum am spus si deasupra, eroarea fiind ‘error C2103: ‘&’ on register variable’ . La fel si la exemplul 4, warning-ul a fost ‘warning C4716: ‘weird’ : must return a value’.
In concluzie, C si C++ sunt limbaje diferite !
Eu vad ca titlul este: Intrebari tricky pentru interviurile C in Linux. Si din cate stiam eu pe Linux se foloseste GCC
, asa ca nu vad ce treaba are Visul Studio C++.
eu dau copy/paste din terminal (la fel si pe xterm chior dar si pe lxterminal).
gcc = 4.6.2 pe arch
primul cod fara string
——————————————————–
#include
void f()
{
char a[3] = “”;
char b[5] = “abcde”;
memcpy(a,b,3);
printf(“%s\n”,a);
}
int main()
{
f();
return 0;
}
—————————————
b.c: In function ‘f’:
b.c:7:1 warning: incompatible implicit declaration of built-in function ‘memcpy’ [enabled by default]
OUT:
abc
al doilea cod cu string
——————————————————–
#include
#include
void f()
{
char a[3] = “”;
char b[5] = “abcde”;
memcpy(a,b,3);
printf(“%s\n”,a);
}
int main()
{
f();
return 0;
}
—————————————
OUT:
abc
Iti afiseaza ‘abc’ pentru ca ‘s-a intamplat‘ ca in memorie sa nu fie nimic dupa sirul a.