I'm reading a textbook on several functions for manipulating the environment array:
If the environment array contains a string of the form name=oldvalue, then unsetenv deletes it and setenv replaces oldvalue with newvalue, but only if overwrite is nonzero. If name does not exist, then setenv adds name=newvalue to the array
int setenv(const char *name, const char *newvalue, int overwrite);
void unsetenv(const char *name);
and below is a picture that depicts the organization of the user stack when a new program starts.

My questions are:
Q1- let's say we use unsetenv delete one element of envp, isn't it going to create a gap in envp by replacing original value with NULL? since the value is NULL, any subsequent environment elements after it will be ingored?
Q2-if we use setenv to replace a oldvalue with newvalue, if the lengh of newvalue is greater than oldvalue, then it is not going to work if setenv just modify the exiting section of "Null-terminated environment variable strings". So my guessing is, there will be a new element pushed to the stack, and the corrsponding pointer element in the envp wiill be changed accordingly, is my understanding correct?