Most users (programmers) do not think of their programs as existing in one continuous linear address space.
Rather they tend to think of their memory in multiple segments, each dedicated to a particular use, such as the code [= text section], data, the stack, the heap, etc.
Memory segmentation supports this view by providing addresses with a segment number (mapped to a segment base address) and an offset from the beginning of that segment. That is, each segment will have its own base address.
For example, a C compiler might generate 5 segments for the user code, library code, global variables, the stack, and the heap, as shown in the figure on the following slide.